Опираясь на ошибку автоматической регистрации сервиса на объекте ORM

Я занимаюсь разработкой приложения Symfony 3. Логи Symfony Profiler говорят мне:

Relying on service auto-registration for type "App\Entity\SubDir\Category"is deprecated since version 3.4 and won't be supported in 4.0.
Create a service named "App\Entity\SubDir\Category" instead.

Тем не менее, это простой компонент ORM:

/**
* @ORM\Entity
* @ORM\Table(name="category")
*/
class Category
{
...

Как мне избавиться от этой проблемы? Мне действительно нужно объявлять объекты ORM как сервисы в services.yaml? Если да, то как?

Обновить
На самом деле, моя сущность находится в подкаталоге. Я исправил свой вопрос.

В моем service.yaml, Я пытался:

App\:
resource: '../src/*'
exclude: '../src/{Entity,Repository,Tests,Entity/SubDir}'

…но безрезультатно.

8

Решение

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

Вот откуда твоя проблема.

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

Если он не используется в качестве сервиса через контейнер, у вас есть 2 варианта:

Вы можете исключить этот класс также с помощью шаблона glob, как, например,

AppBundle\:
resource: '...'
# you can exclude directories or files
# but if a service is unused, it's removed anyway
exclude: '../../{Entity,PathToYourNotService}'

или вы можете установить следующий параметр в вашей конфигурации

parameters:
container.autowiring.strict_mode: true

с этой опцией контейнер не будет пытаться создать класс сервиса с аргументами, которые недоступны как сервисы, и вы получите решающую ошибку. Это настройка по умолчанию для sf4

Хорошим примером для класса, который вызывает именно эту ошибку, будет пользовательский класс событий, который принимает объект в качестве полезной нагрузки в конструкторе:

namespace AppBundle\Event;

use AppBundle\Entity\Item;
use Symfony\Component\EventDispatcher\Event;

class ItemUpdateEvent extends Event
{
const NAME = 'item.update';

protected $item;

public function __construct(Item $item)
{
$this->item = $item;
}

public function getItem()
{
return $this->item;
}
}

Теперь, если этот файл не исключен, контейнер будет пытаться автоматически зарегистрировать его как сервис. А поскольку сущность исключена, она не может подключить ее автоматически. Но в 3.4 есть этот запасной вариант, который вызывает это предупреждение.
Когда активизирован strict_mode, событие просто не будет доступно в качестве службы, и если вы попытаетесь использовать его как единицу, возникнет ошибка.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]