Merge branch 'fix/api-crud-improve-loading-for-existing-controller' into 'master'

Fix/api crud improve loading for existing controller

See merge request Chill-Projet/chill-bundles!92
This commit is contained in:
Julien Fastré 2021-06-23 20:44:25 +00:00
commit ca9ae3874c
2 changed files with 23 additions and 19 deletions

View File

@ -22,6 +22,7 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\Reference;
use Chill\MainBundle\Routing\MenuComposer; use Chill\MainBundle\Routing\MenuComposer;
use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Alias;
/** /**
* *
@ -49,29 +50,32 @@ class CRUDControllerCompilerPass implements CompilerPassInterface
private function configureCrudController(ContainerBuilder $container, array $crudEntry, string $apiOrCrud): void private function configureCrudController(ContainerBuilder $container, array $crudEntry, string $apiOrCrud): void
{ {
$controllerClass = $crudEntry['controller']; $controllerClass = $crudEntry['controller'];
$controllerServiceName = 'cs'.$apiOrCrud.'_'.$crudEntry['name'].'_controller'; $controllerServiceName = 'cs'.$apiOrCrud.'_'.$crudEntry['name'].'_controller';
if ($container->hasDefinition($controllerClass)) { // create config parameter in container
$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']; $param = 'chill_main_'.$apiOrCrud.'_config_'.$crudEntry['name'];
$container->setParameter($param, $crudEntry); $container->setParameter($param, $crudEntry);
$controller->addMethodCall('setCrudConfig', ['%'.$param.'%']);
$container->setDefinition($controllerServiceName, $controller); 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);
}
} }
} }

View File

@ -142,7 +142,7 @@ class CRUDRoutesLoader extends Loader
protected function loadApi(array $crudConfig): RouteCollection protected function loadApi(array $crudConfig): RouteCollection
{ {
$collection = new RouteCollection(); $collection = new RouteCollection();
$controller ='csapi_'.$crudConfig['name'].'_controller'; $controller = 'csapi_'.$crudConfig['name'].'_controller';
foreach ($crudConfig['actions'] as $name => $action) { foreach ($crudConfig['actions'] as $name => $action) {
// filter only on single actions // filter only on single actions