* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ namespace Chill\MainBundle\CRUD\CompilerPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Reference; use Chill\MainBundle\Routing\MenuComposer; use Symfony\Component\DependencyInjection\Definition; /** * * */ class CRUDControllerCompilerPass implements CompilerPassInterface { public function process(ContainerBuilder $container) { $crudConfig = $container->getParameter('chill_main_crud_route_loader_config'); $apiConfig = $container->getParameter('chill_main_api_route_loader_config'); foreach ($crudConfig as $crudEntry) { $this->configureCrudController($container, $crudEntry, 'crud'); } foreach ($apiConfig as $crudEntry) { $this->configureCrudController($container, $crudEntry, 'api'); } } /** * Add a controller for each definition, and add a methodCall to inject crud configuration to controller */ private function configureCrudController(ContainerBuilder $container, array $crudEntry, string $apiOrCrud): void { $controllerClass = $crudEntry['controller']; $controllerServiceName = 'cs'.$apiOrCrud.'_'.$crudEntry['name'].'_controller'; if ($container->hasDefinition($controllerClass)) { $controller = $container->getDefinition($controllerClass); $container->removeDefinition($controllerClass); $alreadyDefined = true; } else { $controller = new Definition($controllerClass); $alreadyDefined = false; } $controller->addTag('controller.service_arguments'); if (FALSE === $alreadyDefined) { $controller->setAutoconfigured(true); $controller->setPublic(true); } $param = 'chill_main_'.$apiOrCrud.'_config_'.$crudEntry['name']; $container->setParameter($param, $crudEntry); $controller->addMethodCall('setCrudConfig', ['%'.$param.'%']); $container->setDefinition($controllerServiceName, $controller); } }