自动注册服务错误:依赖于ORM实体
P粉872182023
P粉872182023 2023-11-05 20:56:05
0
1
835

我正在开发一个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粉872182023
P粉872182023

全部回复(1)
P粉281089485

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板