Intereting Posts
Невозможно вставить в базу данных MySQL с помощью PDO … Нет ошибок Простой пример для публикации на странице фан-сайта Facebook через PHP? Использование дискриминатора в сущности, которая расширяет другую PHP – время минус время до минут Выполнить инструкцию для всех строк xml? Уменьшение белого пространства над вашим заголовком независимо от размера браузера Подтвердить регулярное выражение для почтового индекса Канады Сортировка по ключу в многомерном массиве с php Какие системные файлы должны находиться в закрытой среде для правильной работы php-fpm на ubuntu? Это противоречит шаблону MVC, вызывающему представление в другом представлении с переменными? Лицензирование версий Symfony2 по файлам Собрать $ _POST из нескольких блоков флажков Перенаправление php на основе времени и даты php-страница в img src Переписывание переменной в querystring с .htaccess

'Вызов функции-члена get () для не-объекта'?

Использование 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 ]