* * 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; use Symfony\Component\DependencyInjection\Alias; /** * * */ 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'; // create config parameter in container $param = 'chill_main_'.$apiOrCrud.'_config_'.$crudEntry['name']; $container->setParameter($param, $crudEntry); if ($container->hasDefinition($controllerClass)) { // create an alias to not to re-create the service $alias = new Alias($controllerClass, true); $container->setAlias($controllerServiceName, $alias); // add the "addMethodCall" $container->getDefinition($controllerClass) ->addMethodCall('setCrudConfig', ['%'.$param.'%']); } else { $controller = new Definition($controllerClass); $controller->addTag('controller.service_arguments'); $controller->setAutoconfigured(true); $controller->setPublic(true); $controller->addMethodCall('setCrudConfig', ['%'.$param.'%']); $container->setDefinition($controllerServiceName, $controller); } } }