我有一个称为“邮政”的实体:
/**
* @ORM\Entity(repositoryClass="App\Repository\PostRepository")
*/
class Post
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $content;
/**
* @ORM\ManyToOne(targetEntity="UserSubscriptionTier", inversedBy="posts")
* @Assert\NotBlank()
*
*/
private $subscriptionTier;
... and all the various get/set functions
}
所以我的主要意思是$ subscriptionTier不是集合对象,而仅仅是一个单实体属性。
这是表单类型类的外观:
class PostType扩展AbstractType { / ** * @var UserProvider * / 受保护的$ userProvider;
public function __construct(UserProvider $userProvider)
{
$this->userProvider = $userProvider;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', FileType::class, [
'label' => 'File or Files',
'required' => false,
'mapped' => false,
'multiple' => true,
'attr'=>array('style'=>'display:none;')
])
->add('content', TextareaType::class, [
'required' => false
])
->add('subscriptionTier', EntityType::class, [
'class' => UserSubscriptionTier::class,
'choices' => $this->userProvider->getCurrentUser()->getSubscriptionTiers(),
'choice_label' => 'name',
'required' => false,
'multiple' => true,
'expanded' => true
])
->add('save', SubmitType::class, array(
'attr' => array('class' => 'save')
))
;
}
因此,subscriptionTier只是一个单一实体属性,具有许多可供选择的选项。
这是当我用输入形式在树枝中构建它时的外观:
<select class="custom-select" name="subscriptions" required="required">
<option disabled selected>Visibility</option>
{% for key,val in postForm.subscriptionTier.vars.choices %}
{% if val.data.tierNumber == 1 %}
<option value="{{ val.value }}" {{ postForm.subscriptionTier.vars.value == '' and key == 0 ? ' selected ' :(val.value == postForm.subscriptionTier.vars.value ? ' selected ' : '') }}>All Subscribers</option>
{% endif %}
<option value="{{ val.value }}" {{ postForm.subscriptionTier.vars.value == '' and key == 0 ? ' selected ' :(val.value == postForm.subscriptionTier.vars.value ? ' selected ' : '') }}>{{ val.label | trans }}</option>
{% endfor %}
</select>
提交表单后,以下是控制器代码:
public function createPostAction(PostRepository $postRepository, Request $request)
{
$user = $this->getUser();
$subscriptionId = $request->request->get('subscriptions');
$userSubscriptionTier = $this->subscriptionTierRepository->find($subscriptionId);
$post = new Post();
$post->setUser($user);
$post->setSubscriptionTier($userSubscriptionTier);
$form = $this->createForm(PostType::class, $post);
此createForm函数触发以下错误:
Unable to transform value for property path "subscriptionTier": Expected a Doctrine\Common\Collections\Collection object.
为什么Symfony期望单个实体属性有一个collections对象?表单中的多选项选择是否使Symfony欺骗了ArrayCollection?
答案 0 :(得分:0)
不是100%不确定,但这不是因为这里的'multiple' => true
:
->add('subscriptionTier', EntityType::class, [
'class' => UserSubscriptionTier::class,
'choices' => $this->userProvider->getCurrentUser()->getSubscriptionTiers(),
'choice_label' => 'name',
'required' => false,
'multiple' => true,
'expanded' => true
])
我认为它会创建多值选择,有望通过具有多个值的集合。
docs关于此字段的内容如下:
多个 类型:布尔默认值:false
如果为true,则用户将能够选择多个选项(而不是仅选择一个选项)。根据扩展选项的值,如果为true,则将呈现选择标签或复选框,如果为false,则将呈现选择标签或单选按钮。返回的值将是一个数组。
奇怪的是,您的树枝输出中不包含带有“多个”的选择,因此我有点困惑,但是值得一试。