Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
CRAP | |
92.86% |
13 / 14 |
| BackendCompilerPass | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
8.02 | |
92.86% |
13 / 14 |
| process | |
0.00% |
0 / 1 |
8.02 | |
92.86% |
13 / 14 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\DependencyInjection\Compiler\BackendCompilerPass. | |
| */ | |
| namespace Drupal\Core\DependencyInjection\Compiler; | |
| use Symfony\Component\DependencyInjection\Alias; | |
| use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; | |
| use Symfony\Component\DependencyInjection\ContainerBuilder; | |
| /** | |
| * Defines a compiler pass to allow automatic override per backend. | |
| * | |
| * A module developer has to tag his backend service with "backend_overridable": | |
| * @code | |
| * custom_service: | |
| * class: ... | |
| * tags: | |
| * - { name: backend_overridable } | |
| * @endcode | |
| * | |
| * As a site admin you set the 'default_backend' in your services.yml file: | |
| * @code | |
| * parameters: | |
| * default_backend: sqlite | |
| * @endcode | |
| * | |
| * As a developer for alternative storage engines you register a service with | |
| * $yourbackend.$original_service: | |
| * | |
| * @code | |
| * sqlite.custom_service: | |
| * class: ... | |
| * @endcode | |
| */ | |
| class BackendCompilerPass implements CompilerPassInterface { | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function process(ContainerBuilder $container) { | |
| if ($container->hasParameter('default_backend')) { | |
| $default_backend = $container->getParameter('default_backend'); | |
| // Opt out from the default backend. | |
| if (!$default_backend) { | |
| return; | |
| } | |
| } | |
| else { | |
| try { | |
| $default_backend = $container->get('database')->driver(); | |
| $container->set('database', NULL); | |
| } | |
| catch (\Exception $e) { | |
| // If Drupal is not installed or a test doesn't define database there | |
| // is nothing to override. | |
| return; | |
| } | |
| } | |
| foreach ($container->findTaggedServiceIds('backend_overridable') as $id => $attributes) { | |
| // If the service is already an alias it is not the original backend, so | |
| // we don't want to fallback to other storages any longer. | |
| if ($container->hasAlias($id)) { | |
| continue; | |
| } | |
| if ($container->hasDefinition("$default_backend.$id") || $container->hasAlias("$default_backend.$id")) { | |
| $container->setAlias($id, new Alias("$default_backend.$id")); | |
| } | |
| } | |
| } | |
| } |