2017-02-25 14 views
0

私はSyliusのProductType(AbstractResourceTypeを拡張)内のチャネルエンティティにアクセスするために一日中探してきました。AbstractResourceTypeにEntityManagerを挿入するSylius

:具体的には、私は

でProductTypeクラスのbuildForm()関数(SRC/Sylius /バンドル/ ProductBundle /フォーム/タイプ/ ProductType.php)内 'US_Web_Store' チャンネルエンティティを取得する必要があることはここに私のコードです

のsrc/Sylius /バンドル/ ProductBundle /フォーム/タイプ/ ProductType.php

namespace Sylius\Bundle\ProductBundle\Form\Type; 

use Doctrine\ORM\EntityManagerInterface; 

class ProductType extends AbstractResourceType 
{ 

    private $variantResolver; 
    private $em; 

    public function __construct($dataClass, $validationGroups, ProductVariantResolverInterface $variantResolver, EntityManagerInterface $em) { 
     parent::__construct($dataClass, $validationGroups); 

     $this->variantResolver = $variantResolver; 
     $this->em = $em; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $product = $builder->getData(); 
     $product->addChannel($this->container->get('sylius.repository.channel')->findOneBy(['code' => 'US_Web_Store'])); 

     [...] 
    } 

} 

その後のsrc/Sylius /バンドル/ ProductBundle /リソース/設定/ services.xmlの中:

<service id="product.form.type.product" class="Sylius\Bundle\ProductBundle\Form\Type\ProductType"> 
    <argument type="service" id="doctrine.orm.entity_manager"/> 
</service> 

そして、私は取得していますエラーは次のとおりです。

タイプのエラー:Sylius \バンドル\ ProductBundle \フォーム\タイプ\でProductType :: __構築物()を実装しなければならないインタフェース教義\ ORM \ EntityManagerInterfaceに渡される引数4、どれも

与えられていません

私も経由して、チャネルリポジトリを渡して試してみた:

しかし、同じ問題がありました。コントローラーには何も渡されないので、私はここで何か基本的なものが欠けていると確信しています。

+0

が見えます。あなたは1つしか持っていません。 – craigh

+0

私は他の3つのサービスがどこから来たのか分かりません。私はそれらを探してみました。しかし、私は彼らがデフォルトでどこからでも大丈夫に注射されていると確信しています。私はそれらを追加しませんでした。エラーは4番目の引数にのみ問題があり、それが私が追加したものです。 – carbide20

答えて

1

コードにはいくつかの問題があります。

  1. あなたはそれがデフォルトの代わりに使われることを意味しますProductTypeからSyliusを、使用しています。ただし、お客様のサービスIDは、シリウスproduct.form.type.productシリウスsylius.form.type.product)にあります。結果として、同じSylius\Bundle\ProductBundle\Form\Type\ProductTypeを使用する2つのサービスがあります。あなたが持っている例外は、sylius.form.type.productサービスによって引き起こされ、現在は4番目のパラメータを必要とするクラスを使用しますが、取得できません。同じキーでサービスに名前を付けると、サービス定義のコンストラクタに4つのパラメータすべてを渡す必要があるので、すでにcraighという通知があったため、サービスに同じ名前のサービスを指定すると、例外がスローされます。彼らが何であるかわからない場合は、sylius.form.type.productサービスの定義を見てください。 Syliusフォームをオーバーライドする最も適切な方法について知りたい場合は、Customizing Formsの章を参照してください。
  2. コードでチャンネルを取得する場合は、常にそのチャンネル(sylius.repository.channelサービス)を使用する必要があります。
  3. 新しく作成した製品にチャンネルを設定したいだけなら、カスタムファクトリを使用しないのはなぜですか?よりクリーンな方法であり、将来予期しないエラーが発生することはありません。再度正しく実行する方法については、proper documentation chapterを参照してください。

が、それはあなたを助けることを願っています。あなたは、サービス定義の中ですべての4つの引数を必要とするような)

+0

これは非常に参考になる情報です。あなたの知識を共有する時間を取ってくれてありがとう! – carbide20

関連する問題