Установите аргумент на обслуживание - PullRequest
0 голосов
/ 10 июля 2020

Symfony 2,8

Имея фабрику служб, я хочу передать простой аргумент «строка» при вызове / вызове / получении (как бы вы это ни говорили) службы.

    <services>
    <service id="service.builder_factory" class="Domain\Bundle\Services\ServiceBuilder">
           <argument name="optional" type="string"/>
           <argument type="service" id="request_stack"/>
           <argument type="service" id="event_dispatcher"/>
           <argument type="service" id="doctrine.orm.entity_manager"/>
           <argument key="dir">%kernel.logs_dir%</argument>
       </service>

       <service id="reports" class="Domain\Bundle\Services\ReportsService">
           <factory service="service.builder_factory" method="__factoryMethod"/>
           <tag name="service.builder"/>
       </service>
    </services>

И я не знаю, как установить эту строку в качестве параметра.

$this->getContainer()->get('reports')->setParameter('optional', 'string_to_pass');

Сервисная фабрика работает, но мне нужно передать параметр от контроллера или команды.

1 Ответ

1 голос
/ 10 июля 2020

Вы не можете установить параметр для службы, полученной из контейнера службы. Он уже создан. Заводская служба в конфигурации Symfony не поможет вам и в этом случае.

Вы можете использовать шаблон Prototype , например: получить «ненастроенную» службу из контейнера, клонировать и настроить это:

class MyService {
    private $reportPrototype;

    public function __construct(Report $reportPrototype) // your 'report' service
    {
        $this->reportPrototype = $reportPrototype;
    }

    public function someMethod() {
        $report = $this->getReport('optional');
    }

    protected function getReport(string $optional)
    {
        $result = clone $this->reportPrototype;
        $result->setOptional($optional); // configure your service
        
        return $result;
    }
}

services.xml:

<services>
    <service id="reports" class="Domain\Bundle\Services\ReportsService">
        <argument type="service" id="request_stack"/>
        <argument type="service" id="event_dispatcher"/>
        <argument type="service" id="doctrine.orm.entity_manager"/>
        <argument key="dir">%kernel.logs_dir%</argument>
    </service>

    <service id="my_service" class="MyService">
        <argument type="service" id="reports"/>
    </service>
</services>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...