Symfony:在表单中使用查询生成器
Symfony: use of query builder in a Form
我有一个正在使用 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。但是我得到 "Catchable Fatal Error: Argument 3 passed to Symfony\Bundle\FrameworkBundle\Controller\Controller::createForm() must be of the type array, object given,..."
我知道问题是我如何将 $user 从控制器传递给 formbuilder。但我不知道该怎么做。
有什么想法吗?
createForm 的第三个参数需要一组选项,因此在创建表单时使用它:
$form = $this->createForm(new RosterEventType(), $alert, array('user'=>$user));
然后您需要获取 RosterEventType 以允许提供 'user' 选项。您可以通过覆盖 AbstractType 的 setDefaultOptions 函数并为选项提供默认值来实现。例如,您可以将以下内容添加到您的 RosterEventType class:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'user' => false,
));
}
如果这样做,那么您可以使用 $options['user'].
在 buildForm 函数中访问用户对象
如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;
}
希望对您有所帮助。
我有一个正在使用 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。但是我得到 "Catchable Fatal Error: Argument 3 passed to Symfony\Bundle\FrameworkBundle\Controller\Controller::createForm() must be of the type array, object given,..." 我知道问题是我如何将 $user 从控制器传递给 formbuilder。但我不知道该怎么做。 有什么想法吗?
createForm 的第三个参数需要一组选项,因此在创建表单时使用它:
$form = $this->createForm(new RosterEventType(), $alert, array('user'=>$user));
然后您需要获取 RosterEventType 以允许提供 'user' 选项。您可以通过覆盖 AbstractType 的 setDefaultOptions 函数并为选项提供默认值来实现。例如,您可以将以下内容添加到您的 RosterEventType class:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'user' => false,
));
}
如果这样做,那么您可以使用 $options['user'].
在 buildForm 函数中访问用户对象如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;
}
希望对您有所帮助。