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