新しいディレクトリ構造とすべてを備えたSF 3.3アプリをSF 4に移行しようとしています。
私はこの例外に苦労しています:
コンテナのコンパイル時に、「simplethings_entityaudit.reader」サービスまたはエイリアスが削除またはインライン化されました。公開するか、コンテナの直接使用を中止して、代わりに依存性注入を使用する必要があります。
(このサービスは、/ vendorにある外部バンドルから提供されます)。
それにもかかわらず、私が_bin/console debug:container simplethings_entityaudit.reader
_を実行すると、サービスが存在し、パブリックであることがわかります。
サービス「simplethings_entityaudit.reader」の情報 ================================ ========================= --------------- --------------------------------------- オプション値 ----------------- ------------------------------- ------- サービスID simplethings_entityaudit.reader クラスSimpleThings\EntityAudit\AuditReader タグ- パブリックyes 合成no レイジーなし 共有あり 抽象なし 自動配線なし 自動構成なし[.__ __。]ファクトリサービスsimplethings_entityaudit.manager ファクトリメソッドcreateAuditReader ----------------- ------------ --------------------------
このサービスは現在、$this->container->get('simplethings_entityaudit.reader')
を使用して自分のサービスで呼び出されています。
また、サービスコンストラクタに_SimpleThings\EntityAudit\AuditReader
_を挿入しようとしましたが、次のようになります。
メソッド「__construct()」の引数「$ auditReader」はクラス「SimpleThings\EntityAudit\AuditReader」を参照していますが、そのようなサービスは存在しません。別のルート名前空間からのものであるため、自動登録できません。
これを_services.yaml
_に追加すると機能しますが、これを行う必要はありません。
_SimpleThings\EntityAudit\AuditReader:
alias: simplethings_entityaudit.reader
_
何か案は?
Symfony 4.0では、可視性を指定しないサービスはプライベートです https://github.com/symfony/symfony/pull/24238 。
私が知る限り、あなたが言及するサービスは可視性を指定していません: https://github.com/simplethings/EntityAuditBundle/blob/1.0/src/SimpleThings/EntityAudit/Resources/config/auditable.xml #L23-L26 、これがおそらく例外の理由です。
simplethings_entityaudit.reader
サービスを自動配線できない場合(これはおそらくファクトリサービスを使用しているためです)、次のように@simplethings_entityaudit.reader
表記で参照することにより、サービスを独自のサービスに挿入できます: https ://symfony.com/doc/current/service_container.html#services-manually-wire-args 、次のようになります:
services:
My\Service:
arguments:
$auditReader: @simplethings_entityaudit.reader
私の場合、ユニットテストでエラーが表示されます。
私のプロジェクトの他のすべてのサービスはうまく機能していましたが、テスト(Symfony 4.2)にロードできない単一のサービスがありました。
キャッシュをクリアしましたが、役に立ちませんでした。次に、ルートを持つ単純なコントローラーを作成し、メソッドパラメーターとしてサービスを注入しました。その後、サービスは私のテストでも機能しました。
結論:単体テストがあり、サービスをテストする場合は、サービスが挿入されるコントローラーも提供する必要があります。そうしないと、テストサービスコンテナーで使用できません。明示的なサービス構成も役立つ場合があります。