Symfony внедряет все параметры пакета в службу DI

Я использую Symfony и пытаюсь создать сервис, который содержит все параметры приложения, которые мы установили в нашем файле parameters.xml в нашем AppBundle.

Я сделал это в прошлый раз, внедрив ServiceContainer в Сервис и используя -> get (‘param_name’) для него, который работал нормально, хотя я знаю, что вставлять весь контейнер довольно плохо.

Есть ли способ, которым я могу просто вставить все параметры в мой сервис, не добавляя их каждый как аргумент к определению сервиса ??

Последний проект я сделал это по существу

Определение сервиса

<service id="myapp.application_parameters" class="AppBundle\DependencyInjection\Service\ApplicationParametersService">
<argument type="service" id="service_container" />
</service>

И класс обслуживания

namespace AppBundle\DependencyInjection\Service;

use Symfony\Component\DependencyInjection\ContainerInterface;

class ApplicationParametersService
{
private $_container;
protected $developmentEmail;

function __construct(ContainerInterface $container)
{
$this->_container = $container;

$this->developmentEmail = $this->_container->getParameter('myapp.dev.email');

}

public function getDevEmail()
{
return $this->developmentEmail;
}

0

Решение

Вы правы: инъекция контейнера является антипаттерном в большинстве случаев. Но внедрение всех параметров также является плохой практикой: вы не знаете точно, какие параметры фактически используются службой, потому что она имеет доступ ко всем из них.
Лучше, когда код получает только те значения, которые ему действительно нужны.

Если этот способ приемлем, и вам нужно просто уменьшить стандартный код, то вы можете использовать родительский сервис или автопроводку.

1) с родительская служба:

<service id="generic_service" abstract="true">
<!-- it's better than whole container -->
<argument type="service" id="myapp.application_parameters"/>
</service>

<service id="specific_service_a" class="..." parent="generic_service"/>
<service id="specific_service_b" class="..." parent="generic_service"/>

2) с автопроводкой:

<service id="specific_service_a" class="..." autowire="true">

По крайней мере, вы можете получить контейнер через глобальная переменная. Самый рискованный способ, но это работает.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector