Использование symfony2. У меня есть класс слушателя, который пытается вызвать метод из другого класса (контроллера) следующим образом:
$authenticate = new AuthenticationController(); $authenticate->isTokenValid($token);
И контроллер isTokenValid метод:
public function isTokenValid($token) { $conn = $this->get('database_connection');
Выбрасывает ошибку
Fatal error: Call to a member function get() on a non-object in /home/content/24/9254124/html/newsite/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 246
Если я правильно загружаю метод контроллера (используя маршрутизацию в URL-адресе), он работает нормально.
Symfony2 использует шаблон Injection Dependency, вы должны ввести контейнер, который содержит все службы (например, соединение с базой данных):
$authenticate = new AuthenticationController(); $authenticate->setContainer($this->container); $authenticate->isTokenValid($token);
Конечно, я предполагаю, что ваш класс слушателя ContainerAware
[+] Чтобы сделать ваш слушатель ContainerAware, передайте ему @service_container
(пример формы services.yml
)
my.listener: class: ACME\MyBundle\ListenerController arguments: [ @service_container ] tags: - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } kernel.event_listener: event: kernel.controller
а затем в конструкторе вашего класса слушателя:
public function __construct($container = null){ $this->container = $container; }
Я добавляю еще один ответ, потому что то, что предлагает @ dev-null-dweller, является плохой практикой: почти в каждом случае вам лучше вводить только те услуги, которые вам нужны, а не весь контейнер:
use Doctrine\DBAL\Connection; public function __construct(Connection $connection) { $this->connection = $connection; }
my_listener: arguments: [ @database_connection ]