我正在尝试在我的捆绑中实现一些可重用的翻译。 这些是我的代码的相关部分:
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专家!
答案 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)