gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:37:01 26 4
gpt4 key购买 nike

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

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
));

现在的问题是,我在将请求绑定(bind)到表单时遇到了这个异常:

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/issues/4519有关.

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

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

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

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

关于php - 嵌入式表单生成数组而不是 ArrayCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16758658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com