Heim  >  Fragen und Antworten  >  Hauptteil

Fehler beim automatischen Registrierungsdienst: hängt von ORM-Entitäten ab

Ich entwickle eine Symfony 3-Anwendung. Das Symfony-Profiler-Protokoll sagt mir:

依赖于服务自动注册类型"AppEntitySubDirCategory"已自3.4版本起被弃用,并且在4.0版本中将不再支持。
请创建一个名为"AppEntitySubDirCategory"的服务。

Dies ist jedoch nur eine einfache ORM-Bean:

/**
 * @ORMEntity
 * @ORMTable(name="category")
 */
class Category
{
...

Wie soll ich dieses Problem lösen? Muss ich die ORM-Entität wirklich als Dienst in services.yaml deklarieren? Wenn ja, was ist zu tun?

UPDATE Tatsächlich befinden sich meine Entitäten in einem Unterverzeichnis. Ich habe meine Frage geändert.

In meinem service.yaml habe ich versucht:

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

...Aber es hat keine Wirkung.

P粉872182023P粉872182023372 Tage vor794

Antworte allen(1)Ich werde antworten

  • P粉281089485

    P粉2810894852023-11-06 19:06:16

    您是否在Service-auto registration下有使用实体作为构造函数参数的类?

    这就是您的问题所在。

    您需要问自己,这个相关的类是否真的是一个服务,还是一个您总是自己创建实例的普通对象。

    如果它不是通过容器作为服务使用的,您有两个选择:

    您可以通过类似下面的全局模式来排除这个类:

    AppBundle\:
        resource: '...'
        # 您可以排除目录或文件
        # 但如果一个服务未使用,它会被移除
        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,该事件将无法作为服务使用,如果您尝试将其用作服务,将会引发错误。

    Antwort
    0
  • StornierenAntwort