【问题标题】:Symfony: use of query builder in a FormSymfony:在表单中使用查询构建器
【发布时间】:2015-07-15 22:44:01
【问题描述】:

我有一个正在使用 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')
    ;
}

如您所见,我的 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()) { ....

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

【问题讨论】:

  • 尝试传递用户的id如下:$user->getId()
  • 试试->setParameter('user', $user->getId());
  • 谢谢@Matteo;我试过了,但我得到了可捕获的致命错误:传递给 Symfony\Bundle\FrameworkBundle\Controller\Controller::createForm() 的参数必须是数组类型,给定整数,

标签: symfony query-builder


【解决方案1】:

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

这一行是错误的

$form = $this->createForm(new RosterEventType(), $alert, $user);

$options 参数可以使用例如this

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

如果你想将参数传递给表单,你可以尝试类似 this

控制器

$form = $this->createForm(new RosterEventType($user), $alert);

表格

protected $user;

public function __construct (User $user)
{
    $this->user = $user;
}

希望它会有所帮助。

【讨论】:

  • 是的,这个解决方案,我昨天找到了,但非常感谢。还需要 __construst RosterEventType.php 中的变量(如下): private $userId;公共函数 __construct ($userId) { $this->userId = $userId; }
【解决方案2】:

createForm 的第三个参数需要一个选项数组,所以在创建表单时使用它:

$form = $this->createForm(new RosterEventType(), $alert, array('user'=>$user));

然后您需要获取您的 RosterEventType 以允许提供“用户”选项。您可以通过覆盖 AbstractType 的 setDefaultOptions 函数并为选项提供默认值来做到这一点。例如,您可以将以下内容添加到您的 RosterEventType 类中:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'user' => false,
    ));
}

如果您这样做,那么您可以使用 $options['user'] 在 buildForm 函数中访问用户对象。

【讨论】:

  • 干得好! ;) 更多信息,您可以在帖子中添加 setDefaultOptions Symfony 2.7 中被 configureOptions 替换
  • 您好,我接受了@zilongqiu 的回答,因为它与我使用的相同,但您的也非常好。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2022-01-04
相关资源
最近更新 更多