Php 错误:使用Symfony组件窗体的ChoiceType对非对象调用成员函数

Php 错误:使用Symfony组件窗体的ChoiceType对非对象调用成员函数,php,forms,symfony,symfony-forms,Php,Forms,Symfony,Symfony Forms,我在Defaultcontroller中有showUsersAction方法,它应该呈现一个表单,在该表单中可以从列表中选择一个用户,按下submit按钮,然后重定向到route/showItems/{userId},其中显示了用户的项 我知道通过链接可以很容易地做到这一点,但我想利用ChoiceType: 首先,我从中复制了ChoiceType的一个示例,只做了一点小小的更改: /** * @Route("/showUsers", name="showUsers") */ public f

我在Defaultcontroller中有showUsersAction方法,它应该呈现一个表单,在该表单中可以从列表中选择一个用户,按下submit按钮,然后重定向到route/showItems/{userId},其中显示了用户的项

我知道通过链接可以很容易地做到这一点,但我想利用ChoiceType:

首先,我从中复制了ChoiceType的一个示例,只做了一点小小的更改:

/**
 * @Route("/showUsers", name="showUsers")
 */
public function showUsersAction(){
    $users = $this->getDoctrine()->getManager()->getRepository('AppBundle:User')->findAll();

    $form = $this->createFormBuilder()
        ->setMethod('POST')
        ->add('user', ChoiceType::class, [
            'choices' => $users,
            'choice_label' => function($user) {
                /** @var User $user */
                return strtoupper($user->getUsername());//here is the problem
            },
            'choice_attr' => function($user) {
                return ['class' => 'user_'.strtolower($user->getUsername())];
            },
        ])
        ->getForm();

    return $this->render('default/showUsers.html.twig', 
        array('users' => $users, 'form' => $form->createView()));
}
我确信$users提供了一个包含User类对象的数组。在浏览器中执行路由时,会收到以下错误消息:

Error: Call to a member function getUsername() on a non-object 
in src\AppBundle\Controller\DefaultController.php at line 50
第50行是注释行return strtoupper$user->getUsername

问题是什么?我该如何解决? 在我通过提交按钮提交到同一路线后,如何获得所选用户? 编辑:因为可能重复
当然,我知道不能调用getUsername方法,因为$user是一个非对象,它不应该与Symfony文档相关。因此,我的问题与Symfony特殊解决方案有关,它与100个错误相同的其他问题完全无关。

使用实体类型。这里是一个链接。它是选项类型的子类型,具有完全相同的功能,而且每个选项都返回一个实体对象。

请改用实体类型。这里是一个链接。这是一个选项类型的子类型,具有完全相同的功能,而且每个选项都返回一个实体对象。

因为我在设置实体类型字段时也遇到了问题,所以我决定在此处发布我对整个操作函数和细枝文件的解决方案:

行动方法:

细枝文件:


因为我在设置实体类型字段时也遇到了问题,所以我决定在这里发布整个操作函数和细枝文件的解决方案:

行动方法:

细枝文件:


可能重复您是否尝试检查$user包含在回调函数中?如果$users确实是一个objects数组,那么您的代码应该根据文档工作。如果没有在回调函数中定义,那么我认为$user。如果我添加If语句:If$user{…},那么2的错误就会出现。回调函数。但是为什么呢?我如何添加选项有什么问题吗?可能是重复的您是否尝试过检查$user包含在回调函数中的内容?如果$users确实是一个objects数组,那么您的代码应该根据文档工作。如果没有在回调函数中定义,那么我认为$user。如果我添加If语句:If$user{…},那么2的错误就会出现。回调函数。但是为什么呢?我是如何添加选项的?
/**
 * @Route("/showUsers", name="showUsers")
 */
public function showUsersAction(Request $request){
    // gets array of all users in the database
    $users = $this->getDoctrine()->getManager()->getRepository('AppBundle:User')->findAll();

    $form = $this->createFormBuilder()
    ->setMethod('POST')
    ->add('users', EntityType::class, array(
        'class' => 'AppBundle:User',
        'choices' => $users,

        // This combination of 'expanded' and 'multiple' implements radio buttons
        'expanded' => true,
        'multiple' => false,    
        'choice_label' => function ($user) {
                return $user->__toString();
        }
    ))

    // Adds a submit button to the form. 
    // The 'attr' option adds a class to the html rendered form
    ->add('selected', SubmitType::class, array('label' => 'Show User Items', 'attr' => array('class' => 'button')))
    ->getForm();

    $form->handleRequest($request);

    if ($form->isSubmitted()  && $form->isValid()) {
        // gets the selected user
        $selectedUser = $form["users"]->getData();

        // redirects to route 'showItems' with the id of the selected user
        return $this->redirectToRoute('showItems', array('userId' => $selectedUser->getId()));
    }

    // renders 'default/showUsers.html.twig' with the form as an argument
    return $this->render('default/showUsers.html.twig', array('form' => $form->createView()));
}
{# 
    // app/Resources/views/default/showUsers.html.twig

    Description:
    twig file that implements a form in which one of all users can get
    selected via radio button to show the items of the user after a click
    on the submit button.

    @author goulashsoup

 #}
{% extends 'base.html.twig' %}
{% block title %}Users{% endblock %}
{% block body %}
    <div class="users">
        {{ form_start(form) }}
            {% for user in form.users %}
                {{ form_widget(user) }}
                {{ form_label(user) }}
                <br>
            {% endfor %}
            <br>
        {{ form_end(form) }}
    </div>
{% endblock %}