Вызовы метода сервиса и сеттер-внедрение¶
Tip
Если вы используете автомонтирование, вы можете использвоать @required
,
чтобы автоматически сконфигурировать вызовы метода.
Обычно, вы захотите внедрить ваши зависимости через конструктор. Но иногда, особенно, если зависимость необязательная, вы можете захотеть использовать “сеттер-внедрение”. Например:
namespace AppBundle\Service;
use Psr\Log\LoggerInterface;
class MessageGenerator
{
private $logger;
public function setLogger(LoggerInterface $logger)
{
$this->logger = $logger;
}
// ...
}
Чтобы сконфигрурировать контейнер так, чтобы он вызывал метод setLogger
,
используйте ключ calls
:
- YAML
1 2 3 4 5 6 7 8
# app/config/services.yml services: AppBundle\Service\MessageGenerator: # ... calls: - method: setLogger arguments: - '@logger'
- XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<!-- app/config/services.xml --> <?xml version="1.0" encoding="UTF-8" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="AppBundle\Service\MessageGenerator"> <!-- ... --> <call method="setLogger"> <argument type="service" id="logger" /> </call> </service> </services> </container>
- PHP
1 2 3 4 5 6
// app/config/services.php use AppBundle\Service\MessageGenerator; use Symfony\Component\DependencyInjection\Reference; $container->register(MessageGenerator::class) ->addMethodCall('setLogger', array(new Reference('logger')));
Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.