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

时间:2013-05-26 11:10:51

标签: php forms symfony doctrine-orm

我正在尝试在我的捆绑中实现一些可重用的翻译。 这些是我的代码的相关部分:

TranslatorKeys.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;
}
...

TranslatorStrings.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;
}

EmbeddableTranslatorKeyType.php:

注意:translator_strings类型在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'
        )
    ));
}
...

TranslatorStringsType.php

...
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'
        )
    ));
}
...

我正试图以这种方式使用embeddable_translator_key:

注意:标题是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(如果它是一个数组),那么这是一个简单的解决方法,但我宁愿搜索适当的sollution。

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

欢迎Symfony专家!

1 个答案:

答案 0 :(得分:1)

此问题可能与symfony/issues/4519有关。

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

public function setStrings($strings)
{ 
   $this->strings = is_array($strings) ? new ArrayCollection($strings) : $strings;
}

如果您使用的是较新版本的symfony,但未发生此错误,最好是对 ArrayCollection 进行类型检查,但一般收集或省略类型 - 完全检查:

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