Symfony 3.4: правильно настроенная служба не найдена

У меня есть класс обслуживания с именем класса NewsService.

Сервис настроен следующим образом:

services:
    portal.news:
        class: xxx\NewsBundle\Service\NewsService
        arguments: ["@doctrine.orm.entity_manager"]

Я использую Phpstorm с плагином symfony - плагин находит службу, а сама Symfony - нет.

Я получаю следующее сообщение об ошибке:

An exception has been thrown during the rendering of a template ("You have requested a non-existent service "portal.news".").

Как я пользуюсь услугой:

  1. {{ render(controller('xxBundle:Widget:renderNews', {'slice_length': 250})) }}
  2. в Контроллере xxBundle:Widget:renderNews: $articles = $this->get('portal.news')->getNewestArticles($count);

    • cache is cleared
    • Все проверил (неверная конфигурация сервиса, пакет загружен, синтаксис в порядке, ...)

person Community    schedule 21.01.2018    source источник
comment
В чем yml вы это определили? Вы уверены, что он введен в контейнер?   -  person Łukasz D. Tulikowski    schedule 21.01.2018
comment
Попробуйте использовать cli для отладки контейнера, чтобы увидеть все зарегистрированные службы php bin\console debug:container, также я считаю, что намного проще просто иметь службы Symfony 3.3+ autowire вместо того, чтобы настраивать их самостоятельно.   -  person JimL    schedule 21.01.2018
comment
Ваша проблема, вероятно, в public: true в вашей конфигурации, как указано в ответе ниже. Подумайте о переходе на Symfony 4, они полагаются на внедрение зависимостей, и вам не нужно беспокоиться о таких вещах.   -  person Alex Karshin    schedule 21.01.2018
comment
он определен в service.yml пакета. public: true не решает. Отладчик ничего не знает об услуге ...   -  person    schedule 21.01.2018
comment
есть новости о вашей проблеме? (см. последний комментарий к моему ответу)   -  person Fabien Papet    schedule 02.02.2018


Ответы (2)


Вы, вероятно, забыли установить public: true для своей службы, потому что с версии 3.4 все службы Symfony по умолчанию являются частными.

Кроме того, вам следует избегать $this->get() функций и предпочитать извлекать вашу службу напрямую из аргументов вашего контроллера.

<?php 
use xxx\NewsBundle\Service\NewsService
class MyController {
    public function myAction(NewsService $service)  {}
}
person Fabien Papet    schedule 21.01.2018
comment
Все остальные службы всего проекта (около 20 классов обслуживания) определены без public: true, и они работают. Почему мне следует избегать звонков типа this->get()? Пожалуйста, объясни. - person ; 21.01.2018
comment
В этой документации говорится, что symfony.com/doc/current/ - person Fabien Papet; 22.01.2018
comment
Возможно, вы сможете предоставить полную конфигурацию .yml, чтобы я мог лучше понять, в чем ваша проблема. - person Fabien Papet; 22.01.2018

Используя Service, которому нужен аргумент, вам необходимо объявить свою службу как псевдоним https://symfony.com/doc/current/service_container.html#explicitly-configuring-services-and-arguments

person Smaïne    schedule 21.01.2018
comment
аргумент определен (аргументы в отрывке конфигурации в моем вопросе). - person ; 21.01.2018
comment
Вы смотрели документ? Я видел, что вы объявляете аргументы. Я просто предлагаю добавить псевдоним? Пожалуйста, прочтите документ и после задайте вопрос! - person Smaïne; 22.01.2018