RegisterAccessChecksPass.php 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. <?php
  2. namespace Drupal\Core\DependencyInjection\Compiler;
  3. use Symfony\Component\DependencyInjection\ContainerBuilder;
  4. use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
  5. /**
  6. * Adds services tagged 'access_check' to the access_manager service.
  7. */
  8. class RegisterAccessChecksPass implements CompilerPassInterface {
  9. /**
  10. * {@inheritdoc}
  11. */
  12. public function process(ContainerBuilder $container) {
  13. if (!$container->hasDefinition('access_manager')) {
  14. return;
  15. }
  16. // Add services tagged 'access_check' to the access_manager service.
  17. $access_manager = $container->getDefinition('access_manager.check_provider');
  18. foreach ($container->findTaggedServiceIds('access_check') as $id => $attributes) {
  19. $applies = [];
  20. $method = 'access';
  21. $needs_incoming_request = FALSE;
  22. foreach ($attributes as $attribute) {
  23. if (isset($attribute['applies_to'])) {
  24. $applies[] = $attribute['applies_to'];
  25. }
  26. if (isset($attribute['method'])) {
  27. $method = $attribute['method'];
  28. }
  29. if (!empty($attribute['needs_incoming_request'])) {
  30. $needs_incoming_request = TRUE;
  31. }
  32. }
  33. $access_manager->addMethodCall('addCheckService', [$id, $method, $applies, $needs_incoming_request]);
  34. }
  35. }
  36. }