我一直在寻找一种方法来访问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,没有给出
我还尝试通过以下方式传递频道存储库:
但是有同样的问题。什么都没有传递给控制器,所以我确定我在这里遗漏了一些基本的东西。
答案 0 :(得分:1)
您的代码中存在一些问题。
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章节。sylius.repository.channel
服务)。希望它会对你有所帮助;)