首页  >  问答  >  正文

自动注册服务错误:依赖于ORM实体

我正在开发一个Symfony 3应用程序。Symfony profiler日志告诉我:

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

然而,这只是一个简单的ORM bean:

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

我应该如何解决这个问题?我真的需要在services.yaml中将ORM实体声明为服务吗?如果是的,应该如何做?

更新 事实上,我的实体在一个子目录中。我已经修改了我的问题。

在我的service.yaml中,我尝试了:

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

...但是没有效果。

P粉872182023P粉872182023323 天前749

全部回复(1)我来回复

  • 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,该事件将无法作为服务使用,如果您尝试将其用作服务,将会引发错误。

    回复
    0
  • 取消回复