私が提供している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を使うことができるようになりました。
よろしければプラグインご利用ください。
質問によるカテゴリ絞り込みプラグイン