Skip to content

Commit 3d319bd

Browse files
committed
some skeleton improvements
1 parent da37780 commit 3d319bd

File tree

11 files changed

+218
-131
lines changed

11 files changed

+218
-131
lines changed

src/Doctrine/DoctrineEntityHelper.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Doctrine\Common\Persistence\ManagerRegistry;
1515
use Doctrine\ORM\Mapping\ClassMetadataInfo;
16+
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
1617

1718
/**
1819
* @author Sadicov Vladimir <[email protected]>
@@ -39,7 +40,8 @@ public function getEntitiesForAutocomplete(): array
3940
$allMetadata = $this->metadataFactory->getAllMetadata();
4041
/** @var ClassMetadataInfo $metadata */
4142
foreach ($allMetadata as $metadata) {
42-
$entities[] = preg_replace('#^[^\\\\]*\\\\Entity\\\\(.*)#', '$1', $metadata->name);
43+
$entityClassDetails = new ClassNameDetails($metadata->name, 'App\\Entity');
44+
$entities[] = $entityClassDetails->getRelativeName();
4345
}
4446

4547
return $entities;

src/Generator.php

+6
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
class Generator
2222
{
2323
private $fileManager;
24+
private $twigHelper;
2425
private $pendingOperations = [];
2526
private $namespacePrefix;
2627

2728
public function __construct(FileManager $fileManager, $namespacePrefix)
2829
{
2930
$this->fileManager = $fileManager;
31+
$this->twigHelper = new GeneratorTwigHelper($fileManager);
3032
$this->namespacePrefix = rtrim($namespacePrefix, '\\');
3133
}
3234

@@ -60,6 +62,10 @@ public function generateClass(string $className, string $templateName, array $va
6062
*/
6163
public function generateFile(string $targetPath, string $templateName, array $variables)
6264
{
65+
$variables = array_merge($variables, [
66+
'helper' => $this->twigHelper,
67+
]);
68+
6369
$this->addOperation($targetPath, $templateName, $variables);
6470
}
6571

src/GeneratorHelper.php renamed to src/GeneratorTwigHelper.php

+10-3
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,15 @@
1616
*
1717
* @internal
1818
*/
19-
class GeneratorHelper
19+
class GeneratorTwigHelper
2020
{
21+
private $baseLayoutExists;
22+
23+
public function __construct(FileManager $fileManager)
24+
{
25+
$this->baseLayoutExists = $fileManager->fileExists('templates/base.html.twig');
26+
}
27+
2128
public function getEntityFieldPrintCode($entity, $field): string
2229
{
2330
$printCode = $entity.'.'.$field['fieldName'];
@@ -37,9 +44,9 @@ public function getEntityFieldPrintCode($entity, $field): string
3744
return $printCode;
3845
}
3946

40-
public function getHead($baseLayoutExists, $title): string
47+
public function getHeadPrintCode($title): string
4148
{
42-
if ($baseLayoutExists) {
49+
if ($this->baseLayoutExists) {
4350
return <<<TWIG
4451
{% extends 'base.html.twig' %}
4552

src/Maker/MakeCrud.php

+52-41
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@
1717
use Symfony\Bundle\MakerBundle\ConsoleStyle;
1818
use Symfony\Bundle\MakerBundle\DependencyBuilder;
1919
use Symfony\Bundle\MakerBundle\Doctrine\DoctrineEntityHelper;
20-
use Symfony\Bundle\MakerBundle\FileManager;
2120
use Symfony\Bundle\MakerBundle\Generator;
22-
use Symfony\Bundle\MakerBundle\GeneratorHelper;
2321
use Symfony\Bundle\MakerBundle\InputConfiguration;
2422
use Symfony\Bundle\MakerBundle\Str;
23+
use Symfony\Bundle\MakerBundle\Validator;
2524
use Symfony\Bundle\TwigBundle\TwigBundle;
2625
use Symfony\Component\Console\Command\Command;
2726
use Symfony\Component\Console\Input\InputArgument;
2827
use Symfony\Component\Console\Input\InputInterface;
28+
use Symfony\Component\Console\Question\Question;
2929
use Symfony\Component\Form\AbstractType;
3030
use Symfony\Component\Security\Csrf\CsrfTokenManager;
3131
use Symfony\Component\Validator\Validation;
@@ -35,12 +35,10 @@
3535
*/
3636
final class MakeCrud extends AbstractMaker
3737
{
38-
private $fileManager;
3938
private $entityHelper;
4039

41-
public function __construct(FileManager $fileManager, DoctrineEntityHelper $entityHelper)
40+
public function __construct(DoctrineEntityHelper $entityHelper)
4241
{
43-
$this->fileManager = $fileManager;
4442
$this->entityHelper = $entityHelper;
4543
}
4644

@@ -59,66 +57,87 @@ public function configureCommand(Command $command, InputConfiguration $inputConf
5957
->addArgument('entity-class', InputArgument::OPTIONAL, sprintf('The class name of the entity to create crud (e.g. <fg=yellow>%s</>)', Str::asClassName(Str::getRandomTerm())))
6058
->setHelp(file_get_contents(__DIR__.'/../Resources/help/MakeCrud.txt'))
6159
;
60+
61+
$inputConfig->setArgumentAsNonInteractive('entity-class');
62+
}
63+
64+
public function interact(InputInterface $input, ConsoleStyle $io, Command $command)
65+
{
66+
$argument = $command->getDefinition()->getArgument('entity-class');
67+
68+
$question = new Question($argument->getDescription());
69+
$question->setValidator([Validator::class, 'notBlank']);
70+
$question->setAutocompleterValues($this->entityHelper->getEntitiesForAutocomplete());
71+
72+
$value = $io->askQuestion($question);
73+
74+
$input->setArgument('entity-class', $value);
6275
}
6376

6477
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator)
6578
{
66-
$entityClassNameDetails = $generator->createClassNameDetails(
79+
$entityClassDetails = $generator->createClassNameDetails(
6780
$input->getArgument('entity-class'),
6881
'Entity\\'
6982
);
7083

71-
$controllerClassNameDetails = $generator->createClassNameDetails(
72-
$entityClassNameDetails->getRelativeNameWithoutSuffix(),
84+
$repositoryClassDetails = $generator->createClassNameDetails(
85+
$entityClassDetails->getRelativeName(),
86+
'Repository\\',
87+
'Repository'
88+
);
89+
90+
$controllerClassDetails = $generator->createClassNameDetails(
91+
$entityClassDetails->getRelativeNameWithoutSuffix(),
7392
'Controller\\',
7493
'Controller'
7594
);
7695

77-
$formClassNameDetails = $generator->createClassNameDetails(
78-
$entityClassNameDetails->getRelativeNameWithoutSuffix(),
96+
$formClassDetails = $generator->createClassNameDetails(
97+
$entityClassDetails->getRelativeNameWithoutSuffix(),
7998
'Form\\',
8099
'Type'
81100
);
82101

83-
$metadata = $this->entityHelper->getEntityMetadata($entityClassNameDetails->getFullName());
84-
$entityVarPlural = lcfirst(Inflector::pluralize($entityClassNameDetails->getShortName()));
85-
$entityVarSingular = lcfirst(Inflector::singularize($entityClassNameDetails->getShortName()));
86-
$routeName = Str::asRouteName($controllerClassNameDetails->getRelativeNameWithoutSuffix());
102+
$metadata = $this->entityHelper->getEntityMetadata($entityClassDetails->getFullName());
103+
$entityVarPlural = lcfirst(Inflector::pluralize($entityClassDetails->getShortName()));
104+
$entityVarSingular = lcfirst(Inflector::singularize($entityClassDetails->getShortName()));
105+
$routeName = Str::asRouteName($controllerClassDetails->getRelativeNameWithoutSuffix());
87106

88107
$generator->generateClass(
89-
$controllerClassNameDetails->getFullName(),
108+
$controllerClassDetails->getFullName(),
90109
'crud/controller/Controller.tpl.php',
91110
[
92-
'entity_full_class_name' => $entityClassNameDetails->getFullName(),
93-
'entity_class_name' => $entityClassNameDetails->getShortName(),
94-
'form_full_class_name' => $formClassNameDetails->getFullName(),
95-
'form_class_name' => $formClassNameDetails->getShortName(),
96-
'route_path' => Str::asRoutePath($controllerClassNameDetails->getRelativeNameWithoutSuffix()),
111+
'entity_full_class_name' => $entityClassDetails->getFullName(),
112+
'entity_class_name' => $entityClassDetails->getShortName(),
113+
'repository_exists' => class_exists($repositoryClassDetails->getFullName()),
114+
'repository_full_class_name' => $repositoryClassDetails->getFullName(),
115+
'repository_class_name' => $repositoryClassDetails->getShortName(),
116+
'repository_var' => lcfirst(Inflector::singularize($repositoryClassDetails->getShortName())),
117+
'form_full_class_name' => $formClassDetails->getFullName(),
118+
'form_class_name' => $formClassDetails->getShortName(),
119+
'route_path' => Str::asRoutePath($controllerClassDetails->getRelativeNameWithoutSuffix()),
97120
'route_name' => $routeName,
98121
'entity_var_plural' => $entityVarPlural,
99122
'entity_var_singular' => $entityVarSingular,
100123
'entity_identifier' => $metadata->identifier[0],
101124
]
102125
);
103126

104-
$formFields = $this->entityHelper->getFormFieldsFromEntity($entityClassNameDetails->getFullName());
105-
106-
$helper = new GeneratorHelper();
127+
$formFields = $this->entityHelper->getFormFieldsFromEntity($entityClassDetails->getFullName());
107128

108129
$generator->generateClass(
109-
$formClassNameDetails->getFullName(),
130+
$formClassDetails->getFullName(),
110131
'form/Type.tpl.php',
111132
[
112133
'entity_class_exists' => true,
113-
'entity_full_class_name' => $entityClassNameDetails->getFullName(),
114-
'entity_class_name' => $entityClassNameDetails->getShortName(),
134+
'entity_full_class_name' => $entityClassDetails->getFullName(),
135+
'entity_class_name' => $entityClassDetails->getShortName(),
115136
'form_fields' => $formFields,
116-
'helper' => $helper,
117137
]
118138
);
119139

120-
$baseLayoutExists = $this->fileManager->fileExists('templates/base.html.twig');
121-
$templatesPath = Str::asFilePath($controllerClassNameDetails->getRelativeNameWithoutSuffix());
140+
$templatesPath = Str::asFilePath($controllerClassDetails->getRelativeNameWithoutSuffix());
122141

123142
$templates = [
124143
'_delete_form' => [
@@ -128,33 +147,25 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
128147
],
129148
'_form' => [],
130149
'edit' => [
131-
'helper' => $helper,
132-
'base_layout_exists' => $baseLayoutExists,
133-
'entity_class_name' => $entityClassNameDetails->getShortName(),
150+
'entity_class_name' => $entityClassDetails->getShortName(),
134151
'entity_var_singular' => $entityVarSingular,
135152
'entity_identifier' => $metadata->identifier[0],
136153
'route_name' => $routeName,
137154
],
138155
'index' => [
139-
'helper' => $helper,
140-
'base_layout_exists' => $baseLayoutExists,
141-
'entity_class_name' => $entityClassNameDetails->getShortName(),
156+
'entity_class_name' => $entityClassDetails->getShortName(),
142157
'entity_var_plural' => $entityVarPlural,
143158
'entity_var_singular' => $entityVarSingular,
144159
'entity_identifier' => $metadata->identifier[0],
145160
'entity_fields' => $metadata->fieldMappings,
146161
'route_name' => $routeName,
147162
],
148163
'new' => [
149-
'helper' => $helper,
150-
'base_layout_exists' => $baseLayoutExists,
151-
'entity_class_name' => $entityClassNameDetails->getShortName(),
164+
'entity_class_name' => $entityClassDetails->getShortName(),
152165
'route_name' => $routeName,
153166
],
154167
'show' => [
155-
'helper' => $helper,
156-
'base_layout_exists' => $baseLayoutExists,
157-
'entity_class_name' => $entityClassNameDetails->getShortName(),
168+
'entity_class_name' => $entityClassDetails->getShortName(),
158169
'entity_var_singular' => $entityVarSingular,
159170
'entity_identifier' => $metadata->identifier[0],
160171
'entity_fields' => $metadata->fieldMappings,

src/Resources/config/makers.xml

-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
</service>
2222

2323
<service id="maker.maker.make_crud" class="Symfony\Bundle\MakerBundle\Maker\MakeCrud">
24-
<argument type="service" id="maker.file_manager" />
2524
<argument type="service" id="maker.doctrine_entity_helper" />
2625
<tag name="maker.command" />
2726
</service>
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,105 @@
1-
<?= "<?php\n"; ?>
1+
<?= "<?php\n" ?>
22

3-
namespace <?= $namespace; ?>;
3+
namespace <?= $namespace ?>;
44

5-
use <?= $entity_full_class_name; ?>;
6-
use <?= $form_full_class_name; ?>;
5+
use <?= $entity_full_class_name ?>;
6+
use <?= $form_full_class_name ?>;
7+
<?php if ($repository_exists): ?>
8+
use <?= $repository_full_class_name ?>;
9+
<?php endif ?>
710
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
811
use Symfony\Component\HttpFoundation\Request;
912
use Symfony\Component\HttpFoundation\Response;
1013
use Symfony\Component\Routing\Annotation\Route;
1114

1215
/**
13-
* @Route("<?= $route_path; ?>")
16+
* @Route("<?= $route_path ?>")
1417
*/
1518
class <?= $class_name ?> extends Controller
1619
{
1720
/**
18-
* @Route("/", name="<?= $route_name; ?>_index", methods="GET"): Response
21+
* @Route("/", name="<?= $route_name ?>_index", methods="GET"): Response
1922
*/
23+
<?php if ($repository_exists): ?>
24+
public function index(<?= $repository_full_class_name ?> $<?= $repository_var ?>)
25+
{
26+
return $this->render('<?= $route_name ?>/index.html.twig', ['<?= $entity_var_plural ?>' => $<?= $repository_var ?>->findAll()]);
27+
}
28+
<?php else: ?>
2029
public function index()
2130
{
22-
$<?= $entity_var_plural; ?> = $this->getDoctrine()
23-
->getRepository(<?= $entity_class_name; ?>::class)
31+
$<?= $entity_var_plural ?> = $this->getDoctrine()
32+
->getRepository(<?= $entity_class_name ?>::class)
2433
->findAll();
2534

26-
return $this->render('<?= $route_name; ?>/index.html.twig', ['<?= $entity_var_plural; ?>' => $<?= $entity_var_plural; ?>]);
35+
return $this->render('<?= $route_name ?>/index.html.twig', ['<?= $entity_var_plural ?>' => $<?= $entity_var_plural ?>]);
2736
}
37+
<?php endif ?>
2838

2939
/**
30-
* @Route("/new", name="<?= $route_name; ?>_new", methods="GET|POST")
40+
* @Route("/new", name="<?= $route_name ?>_new", methods="GET|POST")
3141
*/
3242
public function new(Request $request): Response
3343
{
34-
$<?= $entity_var_singular; ?> = new <?= $entity_class_name; ?>();
35-
$form = $this->createForm(<?= $form_class_name; ?>::class, $<?= $entity_var_singular; ?>);
44+
$<?= $entity_var_singular ?> = new <?= $entity_class_name ?>();
45+
$form = $this->createForm(<?= $form_class_name ?>::class, $<?= $entity_var_singular ?>);
3646
$form->handleRequest($request);
3747

3848
if ($form->isSubmitted() && $form->isValid()) {
3949
$em = $this->getDoctrine()->getManager();
40-
$em->persist($<?= $entity_var_singular; ?>);
50+
$em->persist($<?= $entity_var_singular ?>);
4151
$em->flush();
4252

43-
return $this->redirectToRoute('<?= $route_name; ?>_index');
53+
return $this->redirectToRoute('<?= $route_name ?>_index');
4454
}
4555

46-
return $this->render('<?= $route_name; ?>/new.html.twig', [
47-
'<?= $entity_var_singular; ?>' => $<?= $entity_var_singular; ?>,
56+
return $this->render('<?= $route_name ?>/new.html.twig', [
57+
'<?= $entity_var_singular ?>' => $<?= $entity_var_singular ?>,
4858
'form' => $form->createView(),
4959
]);
5060
}
5161

5262
/**
53-
* @Route("/{<?= $entity_identifier; ?>}", name="<?= $route_name; ?>_show", methods="GET")
63+
* @Route("/{<?= $entity_identifier ?>}", name="<?= $route_name ?>_show", methods="GET")
5464
*/
55-
public function show(<?= $entity_class_name; ?> $<?= $entity_var_singular; ?>): Response
65+
public function show(<?= $entity_class_name ?> $<?= $entity_var_singular ?>): Response
5666
{
57-
return $this->render('<?= $route_name; ?>/show.html.twig', ['<?= $entity_var_singular; ?>' => $<?= $entity_var_singular; ?>]);
67+
return $this->render('<?= $route_name ?>/show.html.twig', ['<?= $entity_var_singular ?>' => $<?= $entity_var_singular ?>]);
5868
}
5969

6070
/**
61-
* @Route("/{<?= $entity_identifier; ?>}/edit", name="<?= $route_name; ?>_edit", methods="GET|POST")
71+
* @Route("/{<?= $entity_identifier ?>}/edit", name="<?= $route_name ?>_edit", methods="GET|POST")
6272
*/
63-
public function edit(Request $request, <?= $entity_class_name; ?> $<?= $entity_var_singular; ?>): Response
73+
public function edit(Request $request, <?= $entity_class_name ?> $<?= $entity_var_singular ?>): Response
6474
{
65-
$form = $this->createForm(<?= $form_class_name; ?>::class, $<?= $entity_var_singular; ?>);
75+
$form = $this->createForm(<?= $form_class_name ?>::class, $<?= $entity_var_singular ?>);
6676
$form->handleRequest($request);
6777

6878
if ($form->isSubmitted() && $form->isValid()) {
6979
$this->getDoctrine()->getManager()->flush();
7080

71-
return $this->redirectToRoute('<?= $route_name; ?>_edit', ['<?= $entity_identifier; ?>' => $<?= $entity_var_singular; ?>->get<?= ucfirst($entity_identifier); ?>()]);
81+
return $this->redirectToRoute('<?= $route_name ?>_edit', ['<?= $entity_identifier ?>' => $<?= $entity_var_singular ?>->get<?= ucfirst($entity_identifier) ?>()]);
7282
}
7383

74-
return $this->render('<?= $route_name; ?>/edit.html.twig', [
75-
'<?= $entity_var_singular; ?>' => $<?= $entity_var_singular; ?>,
84+
return $this->render('<?= $route_name ?>/edit.html.twig', [
85+
'<?= $entity_var_singular ?>' => $<?= $entity_var_singular ?>,
7686
'form' => $form->createView(),
7787
]);
7888
}
7989

8090
/**
81-
* @Route("/{<?= $entity_identifier; ?>}", name="<?= $route_name; ?>_delete", methods="DELETE")
91+
* @Route("/{<?= $entity_identifier ?>}", name="<?= $route_name ?>_delete", methods="DELETE")
8292
*/
83-
public function delete(Request $request, <?= $entity_class_name; ?> $<?= $entity_var_singular; ?>): Response
93+
public function delete(Request $request, <?= $entity_class_name ?> $<?= $entity_var_singular ?>): Response
8494
{
85-
if (!$this->isCsrfTokenValid('delete'.$<?= $entity_var_singular; ?>->get<?= ucfirst($entity_identifier); ?>(), $request->request->get('_token'))) {
86-
return $this->redirectToRoute('<?= $route_name; ?>_index');
95+
if (!$this->isCsrfTokenValid('delete'.$<?= $entity_var_singular ?>->get<?= ucfirst($entity_identifier) ?>(), $request->request->get('_token'))) {
96+
return $this->redirectToRoute('<?= $route_name ?>_index');
8797
}
8898

8999
$em = $this->getDoctrine()->getManager();
90-
$em->remove($<?= $entity_var_singular; ?>);
100+
$em->remove($<?= $entity_var_singular ?>);
91101
$em->flush();
92102

93-
return $this->redirectToRoute('<?= $route_name; ?>_index');
103+
return $this->redirectToRoute('<?= $route_name ?>_index');
94104
}
95105
}

0 commit comments

Comments
 (0)