Как получить сервисы (зависимости) в пользовательском классе - PullRequest
22 голосов
/ 24 декабря 2011

В контроллере я мог бы сделать

$this->get('service.name')

Но как в этом классе я могу это сделать?

Ответы [ 5 ]

26 голосов
/ 24 декабря 2011

Определите свой пользовательский класс как сервис, а затем добавьте в него зависимости.

Ex:

// services.yml
services:
   my.custom.service.id:
       class: My\Custom\Class
       arguments:
         - @service.name
         - @doctrine.orm.entity_manager

Конструктор вашего пользовательского класса получит эти службы в качестве аргументов.

Обязательно ознакомьтесь с Сервисным Контейнером в официальных документах. Все это подробно описывается.

8 голосов
/ 24 декабря 2011

Вы были на правильном пути с ContainerAware.

$this->get('id') на самом деле является ярлыком для $this->container->get('id'). А получить контейнер в свой класс так же просто, как реализовать ContainerAwareInterface - поместить этот фрагмент в свой класс:

public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null)
{
    $this->container = $container;
}
0 голосов
/ 27 сентября 2017

Доступ к контейнеру службы в пользовательском классе (не в классе, определенном службой)

Это не лучшая практика, но она работает.Если ваш пользовательский класс не настроен как служба, вы можете получить доступ к контейнеру службы, используя глобальную переменную $ kernel:

class Helper {

    private $container;

    /**
     * Constructor assigns service container to private container. 
     */
    public function __construct() {

        global $kernel;
        $this->container = $kernel->getContainer();

    }

    function doSOmething() {
        $someService = $this->container->get('service.name');
        // do something with someService ...
    }

}
0 голосов
/ 14 марта 2016

Если вы не знаете полного списка зависимостей, которые вам нужны в момент создания сервиса, вы можете передать контейнер в качестве аргумента http://symfony.com/doc/current/book/service_container.html#using-the-expression-language

services:  
    service_name:  
        class: AppBundle\Class  
        arguments: ['@=container']
0 голосов
/ 24 декабря 2011

ОК. Я полагаю, что ответ @Arms является возможным решением, я нашел, посмотрев на источник до Controller, я мог бы расширить ContainerAware

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...