Symfony:在表单中使用查询构建器

Rap*_*l_b 5 query-builder symfony

我有一个使用 FormBuilder 构建的表单:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('rosters',   'entity',   array(
            'class' => 'ReliefAppsPlatformBundle:Roster',
            'property' => 'display',
            'query_builder' => function(RosterRepository $r) use ($user) {
                return $r->createQueryBuilder('r')
                    ->leftJoin('r.members', 'm')
                    ->addSelect('m')
                    ->where('(m.rights = :adminRight or m.rights = :managerRight) and m.user = :user')
                    ->setParameter('adminRight', RosterMember::ADMIN_LEVEL)
                    ->setParameter('managerRight', RosterMember::MANAGER_LEVEL)
                    ->setParameter('user', $user);
            },
            'required' => true,
            'expanded' => true,
            'multiple' => true
        ))
        ->add('save', 'submit')
    ;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我的 QueryBuilder 使用 $user(当前用户)作为参数。我的控制器看起来像这样:

public function createAction(Request $request, Event $event)
{
    $alert = new RosterEvent;
    $alert->setEvent($event);

    $user = $this->getUser();
    $form = $this->createForm(new RosterEventType(), $alert, $user);
    $form->handleRequest($request);
    if ($form->isValid()) { ....
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要将 $user 传递给 formbiulder。但是我得到“可捕获的致命错误:传递给 Symfony\Bundle\FrameworkBundle\Controller\Controller::createForm() 的参数 3 必须是数组类型,给定的对象,...”我知道问题是我如何传递 $user从控制器到表单构建器。但我不知道该怎么做。有任何想法吗?

小智 5

正如文档$options = array()中提到的,方法的第三个参数( )createForm需要一个数组而不是一个对象。

这条线是错误的

$form = $this->createForm(new RosterEventType(), $alert, $user);
Run Code Online (Sandbox Code Playgroud)

该参数可以像这样$options使用

$form = $this->createForm(new TaskType(), $task, array(
    'action' => $this->generateUrl('target_route'),
    'method' => 'GET',
));
Run Code Online (Sandbox Code Playgroud)

如果你想将参数传递给表单,你可以尝试这样的 事情

控制器

$form = $this->createForm(new RosterEventType($user), $alert);
Run Code Online (Sandbox Code Playgroud)

形式

protected $user;

public function __construct (User $user)
{
    $this->user = $user;
}
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助。