搜尋

首頁  >  問答  >  主體

自動註冊服務錯誤:依賴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粉872182023374 天前795

全部回覆(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
  • 取消回覆