Symfony: using the query builder in the form

I have a form that I create using 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')
    ;
}

As you can see, my QueryBuilder I use $ user (current user) as a parameter. My controller looks like this:

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()) { ....

My problem is that I need to pass $ user to formbiulder. But I get a "Catchable Fatal Error: Argument 3 passed to Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller :: createForm () should be from the types array of the given object, ..." I know, the problem is how I pass $ user from the controller in formbuilder. But I do not know how to do this. Any ideas?

+4
source share
2 answers

, ($options = array()) createForm , .

$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;
}

, .

+3

createForm , :

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

, RosterEventType "". , setDefaultOptions AbstractType . , RosterEventType:

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

, buildForm $options ['user'].

+2

Source: https://habr.com/ru/post/1598043/


All Articles