我正在開發一個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,該事件將無法作為服務使用,如果您嘗試將其用作服務,將會引發錯誤。