symfony service -- Ошибка You have requested a non-existent service

Проблема

В неопределённый момент перестали работать сервисы с ошибкой:

You have requested a non-existent service "..."

Сам сервис описан так:

// app/config/services.yml

// AppBundle/src/Service/ServiceClassName.php

В процессе отладки выяснилось, что было удалено (не вручную, механизм неизвестен) несколько параметров из parameters.yml . Параметры как раз необходимые для сервисов. Но удалились без определённой логики: два параметра одного сервиса и один - другого.

Также было отмечено, что при запуске composer install те же параметры удаляются вновь, даже если их ввести вручную заново.

Решение ошибки composer-а

Итак, удаление параметров и композер оказались не связанными с вышеуказанной ошибкой сервиса. О том, что происходит с parameters.yml, можно прочитать здесь.

Решение ошибки сервиса

Сервис не удалось определить, т.к. конфигурация сервисов (services.yml) была прописана в основной директории проекта: /app/config/services.yml, а следует создать отдельный файл для описания сервисов бандла внутри самого бандла: /src/AppBundle/Resources/config/services.yml. И подключать его в основном файле app/config/config.yml таким образом:

imports:
    - { resource: '@AppBundle/Resources/config/services.yml' }

Теперь такой код вызова в контроллере работатет:

use AppBundle/Service/ServiceClassName;

public function someAction() 
{
    $service = $this->get('service.name');
    $result = $service->method();
    // ...
}
vedro-compota's picture

обычно всё-таки сам своб конфигурацию движок не правит, либо же существуют файлы которые правятся чисто вручную. Если те же параметры удаляются композером -- значит надо смотреть в сторону композера.

Более того -- ваш файл вообще лежит в контроле версий?
Убедитесь, что композер правит его, временно забрав права на запись именно на этот файл -- даже если композер его правит (а других аномалий не наблюдается), это уже повод беспокоиться и выяснить почему это так. И можно ли вообще в этот файл писать что-то руками. Вообще это интересная ситуация. безусловно.

_____________
матфак вгу и остальная классика =)

melisa's picture

файл в .gitignore

vedro-compota's picture

тогда там точно нельзя ничего править руками. Ведь это не заработает на боевом сервере. Или это просто ваш локальный конфиг? Каково вообще его значение в системе, надо это выяснить.

_____________
матфак вгу и остальная классика =)

melisa's picture

файл игнорируется при отправке данных в удалённый репозиторий, а на боевом сервере, он есть и обновляется

vedro-compota's picture

каким образом он обновляется на боевом сервере? как локальный конфиг?
Но обычно в таких файлвх держат только пароли и адреса но никак не конфигурацию классов, если он там обновляется автоматически, то значит (95%) что его вручную править нельзя.

_____________
матфак вгу и остальная классика =)

melisa's picture

а как пароли и адреса туда попадут?
мой сервис использует емейл и пароль для отправки сообщений, поэтому они и передаются в качестве параметров

vedro-compota's picture

а как пароли и адреса туда попадут?

дело в том, что:

если он там обновляется автоматически, то значит (95%) что его вручную править нельзя.

у вас же другой случай, судя по всему.
речь о том что если файл правится автоматчески скиптом, то обычно он не правится руками. Или-или (закон исключенного третьего, обычно работает))

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

скорее всего после вызова композер инсталл модули сами правят его в порядке какой-то очереди, предварительно возможно удаляется вообще всё. А потом они записывают то что им нужно. Или что-то типа того. Но это конечно надо выяснять.

_____________
матфак вгу и остальная классика =)

melisa's picture