Php 嵌入表单生成数组而不是ArrayCollection

Php 嵌入表单生成数组而不是ArrayCollection,php,forms,symfony,doctrine-orm,Php,Forms,Symfony,Doctrine Orm,我试图在我的包中实现一些可重用的翻译。 以下是我的代码的相关部分: translateworkeys.php: ... /** * @var \ArrayCollection * * @ORM\OneToMany(targetEntity="Jumi\TranslatorBundle\Entity\TranslatorStrings", mappedBy="key") */ private $strings; /** * @param Doctrine\Common\Collecti

我试图在我的包中实现一些可重用的翻译。 以下是我的代码的相关部分:

translateworkeys.php:

...
/**
 * @var \ArrayCollection
 * 
 * @ORM\OneToMany(targetEntity="Jumi\TranslatorBundle\Entity\TranslatorStrings", mappedBy="key")
 */
private $strings;
/**
 * @param Doctrine\Common\Collections\ArrayCollection $strings
 */
public function setStrings(ArrayCollection $strings) { // THIS IS LINE 84
    $this->strings = $strings;
}
...
translatorString.php:

/**
 * @var integer
 * 
 * @ORM\ManyToOne(targetEntity="Jumi\TranslatorBundle\Entity\TranslatorLanguages", fetch="LAZY")
 * @ORM\JoinColumns({
 *      @ORM\JoinColumn(name="language_id", referencedColumnName="id", nullable=false)
 * })
 */
private $language;
/**
 * @var string
 *
 * @ORM\Column(name="_value", type="string", nullable=true)
 */
private $value;
/**
 * @param string $value
 */
public function setValue($value) {
    $this->value = $value;
}
EmbeddableTranslatoryType.php:

注意:translator_字符串类型在TranslatorStringsType.php中定义

...
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('strings', 'collection', array(
        'type' => 'translator_strings',
        'options' => array(
            'form_type' => $options['form_type'],
            'required' => $options['required']
        ),
        'prototype' => true,
        'allow_add' => true,
        'allow_delete' => true
    ));
}

public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults(array(
        'data_class' => 'Jumi\TranslatorBundle\Entity\TranslatorKeys',
        'form_type' => 'text'
    ));
    $resolver->addAllowedValues(array(
        'form_type' => array(
            'text',
            'textarea'
        )
    ));
}
...
...
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('value', $options['form_type'], array(
        'label' => false,
        'required' => $options['required']
    ));
    $builder->add('language', 'hidden');
}

public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults(array(
        'form_type' => 'text',
        'data_class' => 'Jumi\TranslatorBundle\Entity\TranslatorStrings'
    ));
    $resolver->addAllowedValues(array(
        'form_type' => array(
            'text',
            'textarea'
        )
    ));
}
...
TranslatorStringsType.php

...
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('strings', 'collection', array(
        'type' => 'translator_strings',
        'options' => array(
            'form_type' => $options['form_type'],
            'required' => $options['required']
        ),
        'prototype' => true,
        'allow_add' => true,
        'allow_delete' => true
    ));
}

public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults(array(
        'data_class' => 'Jumi\TranslatorBundle\Entity\TranslatorKeys',
        'form_type' => 'text'
    ));
    $resolver->addAllowedValues(array(
        'form_type' => array(
            'text',
            'textarea'
        )
    ));
}
...
...
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('value', $options['form_type'], array(
        'label' => false,
        'required' => $options['required']
    ));
    $builder->add('language', 'hidden');
}

public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults(array(
        'form_type' => 'text',
        'data_class' => 'Jumi\TranslatorBundle\Entity\TranslatorStrings'
    ));
    $resolver->addAllowedValues(array(
        'form_type' => array(
            'text',
            'textarea'
        )
    ));
}
...
我正试图以这种方式使用可嵌入的\u转换器\u键:

注意:标题是TranslatorKeys上的多对一关系

$builder->add('title', 'embeddable_translator_key', array(
            'label' => 'label_title',
            'required' => false
        ));
现在的问题是,我在将请求绑定到表单时遇到了以下异常:

Catchable Fatal Error: Argument 1 passed to
Jumi\TranslatorBundle\Entity\TranslatorKeys::setStrings() must be an instance of
Doctrine\Common\Collections\ArrayCollection, array given, called in
E:\prog\SymfonyExperiment\trunk\Symfony\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php on line 350 and defined in
E:\prog\SymfonyExperiment\trunk\Symfony\src\Jumi\TranslatorBundle\Entity\TranslatorKeys.php line 84
如果我只是删除TranslatorKeys实体第84行上ArrayCollection的参数类型定义,并将$strings转换为ArrayCollection(如果它是数组),这是一个简单的解决方法,但我更愿意搜索适当的解决方案

如果我没有提供足够的信息,请随时要求更多


欢迎Symfony专家

这个问题可能与

如果您在表单重构之前使用的是symfony版本,则可以通过以下方法解决此问题:

public function setStrings($strings)
{ 
   $this->strings = is_array($strings) ? new ArrayCollection($strings) : $strings;
}
如果您使用的是较新版本的symfony,但没有出现此错误,则最好对ArrayCollection进行类型检查,但对generalCollection进行类型检查,或者完全忽略类型检查:

/**
 * @param Doctrine\Common\Collections\Collection
 */ 
 public function setStrings(Collection $strings)

请查看我的答案,如果有任何不清楚或不适合您的地方,请进行评论-否则请接受答案:)条令\公共\集合\集合不会改变任何内容。因为错误表明给定的参数是数组。我想知道为什么它是数组。我认为它应该是一个ArrayCollection,如symfony文档中的示例所示。当然,这是一个更简单的方法。@Jumi在某些情况下,传递给这个函数的参数也可以是PersistentCollection类型。集合在某种程度上类似于这些不同集合类型的接口,因为它们都扩展了集合。这就是为什么我向你暗示这一点——过去也有类似的问题。很高兴知道。不幸的是,在我的情况下,它不是一个集合。我已经在使用你建议的解决方法。由于我使用的是最新稳定版本的symfony,它不应该适用于我。对于那些在旧版本上遇到类似问题的用户,您的答案仍然很有帮助。我将在github上发布一个问题。如果作者更新了FW版本,而不是分析原因,那么在这个问题上看到一个整洁的“正确答案”标记将是非常棒的/