В контроллере я мог бы сделать
$this->get('service.name')
Но в пользовательском классе, как я могу это сделать?
В контроллере я мог бы сделать
$this->get('service.name')
Но в пользовательском классе, как я могу это сделать?
Определите свой собственный класс как службу, а затем вставьте в него зависимостей.
Пример:
// services.yml
services:
my.custom.service.id:
class: My\Custom\Class
arguments:
- @service.name
- @doctrine.orm.entity_manager
Конструктор вашего пользовательского класса затем получит эти службы в качестве аргументов.
Обязательно прочитайте в Service Container в официальных документах. Он подробно описывает все это.
Вы были на правильном пути с ContainerAware.
$this->get('id')
на самом деле является ярлыком для $this->container->get('id')
. И получение контейнера в ваш класс так же просто, как реализация ContainerAwareInterface
- включение этого фрагмента в ваш класс:
public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null)
{
$this->container = $container;
}
Если вы не знаете полный список зависимостей, которые вам нужны в момент создания службы, вы можете передать контейнер в качестве аргумента http://symfony.com/doc/current/book/service_container.html#using-the-expression-language
services:
service_name:
class: AppBundle\Class
arguments: ['@=container']
Если ваш пользовательский класс не настроен как услуга, вы можете получить доступ к контейнеру службы с помощью глобальной переменной $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 ...
}
}
OK Я полагаю, что ответ @Arms - это возможное решение, я нашел, посмотрев на источник Controller
, я мог бы расширить ContainerAware