Вызовы метода сервиса и сеттер-внедрение

Tip

Если вы используете автомонтирование, вы можете использвоать @required, чтобы автоматически сконфигурировать вызовы метода.

Обычно, вы захотите внедрить ваши зависимости через конструктор. Но иногда, особенно, если зависимость необязательная, вы можете захотеть использовать "сеттер-внедрение". Например:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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.