From 5bcd2db7658c6babee65c0316c5c451774f2cd7c Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Fri, 14 May 2021 22:20:55 +0200 Subject: [PATCH] add make:crud-controller --- core/Maker/MakeCrudController.php | 99 ++++++++++++++++ .../crud-controller/CrudController.tpl.php | 109 ++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 core/Maker/MakeCrudController.php create mode 100644 core/Resources/maker/crud-controller/CrudController.tpl.php diff --git a/core/Maker/MakeCrudController.php b/core/Maker/MakeCrudController.php new file mode 100644 index 0000000..976f73d --- /dev/null +++ b/core/Maker/MakeCrudController.php @@ -0,0 +1,99 @@ +addArgument( + 'controller-class', + InputArgument::OPTIONAL, + 'Choose a name for your CRUD controller class (e.g. FooAdminController)' + ) + ->addArgument( + 'entity-class', + InputArgument::OPTIONAL, + 'Define the entity (e.g. App\Entity\Foo)' + ) + ->addArgument( + 'repository-query-class', + InputArgument::OPTIONAL, + 'Define the repository query (e.g. App\Repository\FooRepositoryQuery)' + ) + ->addArgument( + 'factory-class', + InputArgument::OPTIONAL, + 'Define the factory (e.g. App\Factory\FooFactory)' + ) + ->addArgument( + 'form-class', + InputArgument::OPTIONAL, + 'Define the form (e.g. App\Form\FooType)' + ) + ->setHelp('') + ; + } + + public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator) + { + $controllerClassNameDetails = $generator->createClassNameDetails( + $input->getArgument('controller-class'), + 'Controller\\', + 'Controller' + ); + + $entity = u($input->getArgument('entity-class')); + $lastBackSlashIndex = $entity->indexOfLast('\\'); + $route = u($entity->slice($lastBackSlashIndex))->snake(); + + $options = [ + 'entity' => (string) $entity, + 'route' => (string) $route, + 'repository_query' => $input->getArgument('repository-query-class'), + 'form' => $input->getArgument('form-class'), + 'factory' => $input->getArgument('factory-class'), + ]; + + $controllerPath = $generator->generateController( + $controllerClassNameDetails->getFullName(), + __DIR__.'/../Resources/maker/crud-controller/CrudController.tpl.php', + $options + ); + + $generator->writeChanges(); + + $this->writeSuccessMessage($io); + $io->text('Next: Open your new controller class and configure it!'); + } + + public function configureDependencies(DependencyBuilder $dependencies) + { + $dependencies->addClassDependency( + Annotation::class, + 'doctrine/annotations' + ); + } +} diff --git a/core/Resources/maker/crud-controller/CrudController.tpl.php b/core/Resources/maker/crud-controller/CrudController.tpl.php new file mode 100644 index 0000000..78c80c5 --- /dev/null +++ b/core/Resources/maker/crud-controller/CrudController.tpl.php @@ -0,0 +1,109 @@ + + +namespace ; + +use App\Core\Controller\Admin\Crud\CrudController; +use App\Core\Crud\CrudConfiguration; +use App\Core\Crud\Field; +use App\Core\Entity\EntityInterface; +use App\Core\Manager\EntityManager; +use as Entity; +use as Factory; +use as Type; +use as RepositoryQuery; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\Session\Session; +use Symfony\Component\Routing\Annotation\Route; + +class extends CrudController +{ + /** + * @Route("/admin//{page}", name="admin__index", methods={"GET"}, requirements={"page":"\d+"}) + */ + public function index(int $page = 1, RepositoryQuery $query, Request $request, Session $session): Response + { + return $this->doIndex($page, $query, $request, $session); + } + + /** + * @Route("/admin//new", name="admin__new", methods={"GET", "POST"}) + */ + public function new(Factory $factory, EntityManager $entityManager, Request $request): Response + { + return $this->doNew($factory->create(), $entityManager, $request); + } + + /** + * @Route("/admin//show/{entity}", name="admin__show", methods={"GET"}) + */ + public function show(Entity $entity): Response + { + return $this->doShow($entity); + } + + /** + * @Route("/admin//filter", name="admin__filter", methods={"GET"}) + */ + public function filter(Session $session): Response + { + return $this->doFilter($session); + } + + /** + * @Route("/admin//edit/{entity}", name="admin__edit", methods={"GET", "POST"}) + */ + public function edit(Entity $entity, EntityManager $entityManager, Request $request): Response + { + return $this->doEdit($entity, $entityManager, $request); + } + + /** + * @Route("/admin//delete/{entity}", name="admin__delete", methods={"DELETE"}) + */ + public function delete(Entity $entity, EntityManager $entityManager, Request $request): Response + { + return $this->doDelete($entity, $entityManager, $request); + } + + protected function getConfiguration(): CrudConfiguration + { + return CrudConfiguration::create() + ->setPageTitle('index', 'List of ') + ->setPageTitle('edit', 'Edition of {id}') + ->setPageTitle('new', 'New ') + ->setPageTitle('show', 'View of {id}') + + ->setPageRoute('index', 'admin__index') + ->setPageRoute('new', 'admin__new') + ->setPageRoute('edit', 'admin__edit') + ->setPageRoute('show', 'admin__show') + ->setPageRoute('delete', 'admin__delete') + ->setPageRoute('filter', 'admin__filter') + + ->setForm('edit', Type::class, []) + ->setForm('new', Type::class) + // ->setForm('filter', Type::class) + + // ->setMaxPerPage('index', 20) + + // ->setAction('index', 'new', true) + // ->setAction('index', 'show', true) + // ->setAction('index', 'edit', true) + // ->setAction('index', 'delete', true) + + // ->setAction('edit', 'back', true) + // ->setAction('edit', 'show', true) + // ->setAction('edit', 'delete', true) + + // ->setField('index', 'Label', Field\TextField::class, [ + // 'property' => 'label', + // ]) + ; + } + + protected function getSection(): string + { + return ''; + } +}