【EC-CUBEエラー】service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead

私が提供しているEC-CUBEの「質問によるカテゴリ絞り込みプラグイン」を4.1系にアップデートしたのですが、
その際、以下のようなエラーが発生しました。

service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.

調べてみると、これはEC-CUBEが4.1系になり、Symfonyが3系から4系になったことで発生したエラーのようです。
今までプラグインのコード内で「$container->get(Service::class)」のようにしてserviceクラスを呼び出していた箇所があるのですが、
Symfonyのserviceのスコープがprivateになったことが原因で、直接アクセスしてはいけなくなりました。
これに対し、service.yamlに以下のようにpublic:trueと書いて、明示的にpublicアクセスを宣言することで回避することも可能ですが、
パフォーマンスが低下するみたいなのです。

services:
    Plugin\KumahiyoPlugin\Services\KumahiyoService:
      public: true
      arguments:
        - '@Eccube\Common\EccubeConfig'

そこで、別の方法としてserviceを使っているクラスのコンストラクタで呼び出すことにしました。

public function __construct(KumahiyoService $kumahiyoService)
{
    $this->kumahiyoService = $kumahiyoService;
}

public function index()
{
    $this->kumahiyoService->hoge();
}

これで無事エラーが解消し、serviceを使うことができるようになりました。

よろしければプラグインご利用ください。
質問によるカテゴリ絞り込みプラグイン

ABOUTこの記事をかいた人

フリーランスとして働く、フルスタックエンジニア 初崎 匠のサイト。仕事のことから趣味のアニメーション制作、英語学習など、様々なことを通じて、少しでも多くの人が幸せになれるような価値を提供できるよう挑戦し続けます。