ZF2: внедрить переменные в конструктор сервиса - PullRequest
0 голосов
/ 11 сентября 2018

Есть ли способ создать новый экземпляр службы и добавить параметры конструктора? Я немного новичок в внедрении зависимостей и обнаружил, что могу добавлять сервисы как параметры конструктора, а не переменные времени выполнения через фабрику.

Код, который я имею, выглядит примерно так:

Class MyService
{
    private $name;
    private $active;

    public function __construct($name,$active)
    {
        $this->name = $name;
        $this->active = $active;    
    }
}

$myService = $this->getServiceLocator()->get('MyService')

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Допустим, ваш сервис существует:

Class MyService
{
    private $name;
    private $active;

    public function __construct($name,$active)
    {
        $this->name = $name;
        $this->active = $active;    
    }
}

Если вместо ->get() его использовать, вы можете ->build() его :)

class SomeFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        return $container->build(MyService::class, ['name' => "Foo", 'active' => true]);
        // Line below works as well, using a variable requested name, handy for an AbstractFactory of some kind (e.g. one that creates different adapters in the same way with same params)            
        // return $container->build($requestedName, ['name' => "Foo", 'active' => true]); 
    }
}

Проверить ServiceManager build() функция


Примечание: Не уверен, поскольку, когда он присутствует, это работает в более высоких версиях ZF2 и всех ZF3.


Примечание 2: И get(), и build() вызывают функцию doCreate().Объявление функции:

private function doCreate($resolvedName, array $options = null)

get() делает: $object = $this->doCreate($name);

build() делает: return $this->doCreate($name, $options);

0 голосов
/ 15 сентября 2018

Да, есть способ, используя черту MutableCreationOptionsTrait на вашем заводе.

class YourServiceFactory implements FactoryInterface, MutableCreationOptionsInterface
{
    use MutableCreationOptionsTrait;

    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        if (isset($this->creationOptions['name'])) {
            // do something with the name option
        }

        if (isset($this->creationOptions['active'])) {
            // do something with the active option
        }

        $yourService = new YourService(
            $this->creationOptions['active'], 
            $this->creationOptions['name']
        );

        return $yourService;
    }
}

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

$yourService = $this->getServiceLocator()->get(YourService::class, [
    'active' => true,
    'name' => 'Marcel',
]);

Легко, как пирог. ;)

...