将EntityManager注入AbstractResourceType Sylius

时间:2017-02-25 04:56:11

标签: php symfony sylius

我一直在寻找一种方法来访问Sylius中ProductType(扩展AbstractResourceType)中的通道实体。具体来说,我需要获得' US_Web_Store' ProductType类的buildForm()函数中的通道实体(src / Sylius / Bundle / ProductBundle / Form / Type / ProductType.php)

这是我的代码:

的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 / Bundle / ProductBundle / Resources / config / 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 \ Bundle \ ProductBundle \ Form \ Type \ ProductType :: __ construct()的参数4必须实现接口Doctrine \ ORM \ EntityManagerInterface,没有给出

我还尝试通过以下方式传递频道存储库:

但是有同样的问题。什么都没有传递给控制器​​,所以我确定我在这里遗漏了一些基本的东西。

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题。

  1. 您正在使用 Sylius 中的ProductType,这意味着将使用它而不是默认值。但是,您的服务ID与 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以了解如何正确执行此操作。
  4. 希望它会对你有所帮助;)