AddDependencyCallsPass.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. /*
  3. * This file is part of the Sonata project.
  4. *
  5. * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Sonata\AdminBundle\DependencyInjection;
  11. use Symfony\Component\DependencyInjection\Definition;
  12. use Symfony\Component\DependencyInjection\ContainerBuilder;
  13. use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
  14. use Symfony\Component\DependencyInjection\Reference;
  15. use Symfony\Component\DependencyInjection\ContainerInterface;
  16. /**
  17. * Add all dependencies to the Admin class, this avoid to write to many lines
  18. * in the configuration files.
  19. *
  20. * @author Thomas Rabaix <thomas.rabaix@sonata-project.org>
  21. */
  22. class AddDependencyCallsPass implements CompilerPassInterface
  23. {
  24. /**
  25. * {@inheritDoc}
  26. */
  27. public function process(ContainerBuilder $container)
  28. {
  29. $groups = $admins = $classes = array();
  30. //
  31. $pool = $container->getDefinition('sonata_admin.admin.pool');
  32. foreach ($container->findTaggedServiceIds('sonata.admin') as $id => $attributes) {
  33. $definition = $container->getDefinition($id);
  34. $calls = array(array('setCode', array($id))) + $definition->getMethodCalls();
  35. $definition->setMethodCalls($calls);
  36. $this->applyDefaults($definition, $attributes);
  37. $arguments = $definition->getArguments();
  38. if (preg_match('/%(.*)%/', $arguments[0], $matches)) {
  39. $class = $container->getParameter($matches[1]);
  40. } else {
  41. $class = $arguments[0];
  42. }
  43. $admins[] = $id;
  44. $classes[$class] = $id;
  45. $group_name = isset($attributes[0]['group']) ? $attributes[0]['group'] : 'default';
  46. if (!isset($groups[$group_name])) {
  47. $groups[$group_name] = array();
  48. }
  49. $groups[$group_name][$id] = array(
  50. 'show_in_dashboard' => (boolean)(isset($attributes[0]['show_in_dashboard']) ? $attributes[0]['show_in_dashboard'] : true)
  51. );
  52. }
  53. $pool->addMethodCall('setAdminServiceIds', array($admins));
  54. $pool->addMethodCall('setAdminGroups', array($groups));
  55. $pool->addMethodCall('setAdminClasses', array($classes));
  56. //
  57. $routeLoader = $container->getDefinition('sonata_admin.route_loader');
  58. $routeLoader->addArgument($admins);
  59. }
  60. /**
  61. * Apply the default values required by the AdminInterface to the Admin service definition
  62. *
  63. * @param \Symfony\Component\DependencyInjection\Definition $definition
  64. * @param array $attributes
  65. * @return \Symfony\Component\DependencyInjection\Definition
  66. */
  67. public function applyDefaults(Definition $definition, array $attributes = array())
  68. {
  69. $definition->setScope(ContainerInterface::SCOPE_PROTOTYPE);
  70. $manager_type = $attributes[0]['manager_type'];
  71. if (!$definition->hasMethodCall('setModelManager')) {
  72. $definition->addMethodCall('setModelManager', array(new Reference(sprintf('doctrine.%s.default_entity_manager', $manager_type))));
  73. }
  74. if (!$definition->hasMethodCall('setFormBuilder')) {
  75. $definition->addMethodCall('setFormBuilder', array(new Reference(sprintf('sonata_admin.builder.%s_form', $manager_type))));
  76. }
  77. if (!$definition->hasMethodCall('setListBuilder')) {
  78. $definition->addMethodCall('setListBuilder', array(new Reference(sprintf('sonata_admin.builder.%s_list', $manager_type))));
  79. }
  80. if (!$definition->hasMethodCall('setDatagridBuilder')) {
  81. $definition->addMethodCall('setDatagridBuilder', array(new Reference(sprintf('sonata_admin.builder.%s_datagrid', $manager_type))));
  82. }
  83. if (!$definition->hasMethodCall('setTranslator')) {
  84. $definition->addMethodCall('setTranslator', array(new Reference('translator')));
  85. }
  86. if (!$definition->hasMethodCall('setConfigurationPool')) {
  87. $definition->addMethodCall('setConfigurationPool', array(new Reference('sonata_admin.admin.pool')));
  88. }
  89. if (!$definition->hasMethodCall('setRouter')) {
  90. $definition->addMethodCall('setRouter', array(new Reference('router')));
  91. }
  92. if (!$definition->hasMethodCall('setLabel')) {
  93. $label = isset($attributes[0]['label']) ? $attributes[0]['label'] : '-';
  94. $definition->addMethodCall('setLabel', array($label));
  95. }
  96. $definition->addMethodCall('configure');
  97. return $definition;
  98. }
  99. }