【问题标题】:Inject EntityManager into AbstractResourceType Sylius将 EntityManager 注入 AbstractResourceType Sylius
【发布时间】:2017-02-25 04:56:10
【问题描述】:

我整天都在寻找一种方法来访问 Sylius 中 ProductType(它扩展了 AbstractResourceType)中的通道实体。具体来说,我需要在 ProductType 类 (src/Sylius/Bundle/ProductBundle/Form/Type/ProductType.php) 的 buildForm() 函数中获取“US_Web_Store”频道实体

这是我的代码:

src/Sylius/Bundle/ProductBundle/Form/Type/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,没有给出

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

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

【问题讨论】:

  • 看起来您需要服务定义中的所有四个参数。你只有一个。
  • 我不确定其他 3 项服务从何而来,我尝试寻找这些服务却空手而归。但我确信默认情况下它们是从其他地方注入的,我没有添加这些。您会注意到错误只有第四个参数有问题,这是我添加的唯一一个。

标签: php symfony sylius


【解决方案1】:

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

  1. 您正在使用 SyliusProductType,这意味着将使用它而不是默认值。但是,您的服务 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,了解如何正确操作。

希望对你有所帮助;)

【讨论】:

  • 这是非常有用的信息。非常感谢您抽出宝贵时间分享您的知识!
猜你喜欢
  • 2014-09-23
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2017-05-19
  • 1970-01-01
相关资源
最近更新 更多