L'iniezione delle dipendenze viene aggiunta al core, ma non c'è documentazione che indichi come gli sviluppatori possano modificare i servizi predefiniti. Ad esempio, vorrei cambiare la classe cache.bootstrap in cache APC.
L'iniezione delle dipendenze viene aggiunta al core, ma non c'è documentazione che indichi come gli sviluppatori possano modificare i servizi predefiniti. Ad esempio, vorrei cambiare la classe cache.bootstrap in cache APC.
Risposte:
Puoi guardare LanguageTestServiceProvider per vedere come vengono apportate le modifiche. Oppure posso offrire la mia classe:
<?php
namespace Drupal\mongodb;
use Drupal\Core\DependencyInjection\ServiceModifierInterface;
use Drupal\Core\DependencyInjection\ServiceProviderInterface;
use Drupal\Core\DependencyInjection\ContainerBuilder;
/**
* MongoDB service provider. Registers Mongo-related services.
*/
class MongodbServiceProvider implements ServiceProviderInterface, ServiceModifierInterface {
/**
* {@inheritdoc}
*/
public function register(ContainerBuilder $container) {
}
/**
* {@inheritdoc}
*/
public function alter(ContainerBuilder $container) {
foreach ($container->findTaggedServiceIds('mongodb.override') as $id => $attribute) {
$container->setDefinition(substr($id, 8), $container->getDefinition($id));
}
}
}
Fondamentalmente, alter
è necessario utilizzare il getDefinition
metodo, fare qualcosa con la definizione e quindi utilizzare il setDefinition
metodo per rimetterlo.
e quindi ecco le parti rilevanti di mongodb.services.yml:
services:
mongodb.flood:
class: Drupal\mongodb\Flood\MongoDBBackend
arguments: ['@mongo', '@request']
tags:
- { name: mongodb.override }
setDefintion()
se lo hai utilizzato getDefinition()
: puoi semplicemente aggiornare la definizione.