Symfony希望对单实体属性使用ArrayCollection

时间:2019-01-11 08:17:40

标签: object collections doctrine transform

我有一个称为“邮政”的实体:

/**
 * @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?

1 个答案:

答案 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,则将呈现选择标签或单选按钮。返回的值将是一个数组。

奇怪的是,您的树枝输出中不包含带有“多个”的选择,因此我有点困惑,但是值得一试。