2017-02-25 121 views
0

我一直在尋找一種方法來訪問Sylius中的ProductType(它擴展了AbstractResourceType)中的通道實體。具體來說,我需要將ProductType類的buildForm()函數中得到 'US_Web_Store' 通道實體(SRC/Sylius /包/ ProductBundle /表/類型/ ProductType.php)將EntityManager注入AbstractResourceType Sylius

這裏是我的代碼:

的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

看起來像你需要在服務定義中的所有四個參數。你只有一個。 – craigh

+0

我不確定其他3種服務來自哪裏,我試圖尋找那些並空手而來。但我確定他們是從其他地方默認注入的,我沒有添加這些。你會注意到這個錯誤在第四個參數中只有一個問題,這是我添加的唯一一個。 – carbide20

回答

1

你的代碼有幾個問題。

  1. 您使用的是ProductTypeSylius,這意味着它將被用來替代默認的。但是,您的服務編號與此不同Sylius(您有product.form.type.product,在Sylius它是sylius.form.type.product)。結果,您將有兩個使用相同Sylius\Bundle\ProductBundle\Form\Type\ProductType的服務。你有異常是由sylius.form.type.product服務,現在使用你的類需要第四個參數,但它沒有得到它。事件如果您使用相同的密鑰命名服務,它仍然會拋出異常,因爲您需要將所有4個參數傳遞到服務定義中的構造函數中,因爲它已通過craigh發佈。如果你不知道它們是什麼,你應該看看sylius.form.type.product服務的定義。要了解覆蓋Sylius表格的最正確方法,請查看文檔中的Customizing Forms章節。
  2. 如果您想通過代碼獲取渠道,則應始終使用該存儲庫(sylius.repository.channel服務)。
  3. 如果您只是想在新創建的產品上設置頻道,爲什麼不使用自定義工廠呢?這是更乾淨的方式,不會在未來導致任何意外錯誤。再次檢查proper documentation chapter以瞭解如何正確執行此操作。

希望它會幫助你;)

+0

這是非常有用的信息。非常感謝您花時間分享您的知識! – carbide20

相關問題