web-dev-qa-db-ja.com

symfony 4-サービスは削除されたか、公開されていますがインライン化されました

新しいディレクトリ構造とすべてを備えた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
_

何か案は?

10
Ben

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
4
Edi Modrić

私の場合、ユニットテストでエラーが表示されます。

私のプロジェクトの他のすべてのサービスはうまく機能していましたが、テスト(Symfony 4.2)にロードできない単一のサービスがありました。

キャッシュをクリアしましたが、役に立ちませんでした。次に、ルートを持つ単純なコントローラーを作成し、メソッドパラメーターとしてサービスを注入しました。その後、サービスは私のテストでも機能しました。

結論:単体テストがあり、サービスをテストする場合は、サービスが挿入されるコントローラーも提供する必要があります。そうしないと、テストサービスコンテナーで使用できません。明示的なサービス構成も役立つ場合があります。

4
Hendrik Pilz