自動註冊服務錯誤:依賴ORM實體
P粉872182023
P粉872182023 2023-11-05 20:56:05
0
1
834

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板