Задать вопрос
SerafimArts
@SerafimArts
Senior Notepad Reader

Как вызвать метод в Symfony с autowire'ингом?

Доброго времени суток уважаемые!

Собственно вопрос уже обозначен в заголовке. Как вызвать метод сквозь контейнер?

<?php
class Some
{
    public function any(DependencyA $a, DependencyB $b)
    {
        // do something
    }
}

// Вызов
// service.name должен быть зарегистрированным в services.yml
$instance = $container->get('service.name'); 

// А дальше?


Аналогичный пример в Laravel 5+:
<?php
class Some
{
    public function any(DependencyA $a, DependencyB $b, $some)
    {
        // do something
    }
}

// Вызов
// Получение инстанса из контейнера (аналогично вызову $container->get('service.name') в симфони )
$instance = $container->make(Some::class);

// Все аргументы из контейнера 
// т.е. $a и $b, срабатывает автоматический автовайринг для неуказанных аргументов
// кроме $some - он указывается явно во время вызова
$container->call([$instance, 'any'], [ 'some' => 42 ]);
  • Вопрос задан
  • 1687 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Radik_Wind
@Radik_Wind
Для того, что бы ваши сервисы соответствовали лучшим практикам Symfony зависимости в них нужно передавать следующим способом:
- в конструкторе, для тех зависимостей без которых ваш сервис работать не будет, к примеру data source или что то подобное
- в сеттерах зависимости без которых ваш сервис будет работать, но будет не доступна какая то часть не основной функциональности, к примеру логирование
- ну и не нужно в качестве зависимостей передавать сам контейнер, некоторые разработчики грешат этим, особенно когда сервис имеет много зависимостей, если у вас возникает такая необходимость стоит разделить сервис на несколько более мелких самодостаточных сервисов с минимумом зависимостей
Ответ написан
voronkovich
@voronkovich
В Symfony-контейнере случай описанный для Laravel работать не будет.
Сделайте без autowiring. Или добавьте для зависимостей сеттеры, тогда контейнер внедрит их автоматически:
<?php
class Some
{
    public function setDependencyA(DependencyA $a)
    {
        $this->dependencyA = $a;
    }

    public function any()
    {
         $this->dependencyA->someMethod();
          // do something 
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы