简体   繁体   中英

Symfony2 form query_builder with parameter

I have this error :

"Catchable Fatal Error: Argument 1 passed to Intranet\\RhBundle\\Form\\AvatarFormType::Intranet\\RhBundle\\Form{closure}() must be an instance of Intranet\\UserBundle\\Entity\\ImageRepository, instance of Doctrine\\ORM\\EntityRepository given, called in C:\\wamp\\www\\projet\\vendor\\symfony\\symfony\\src\\Symfony\\Bridge\\Doctrine\\Form\\ChoiceList\\ORMQueryBuilderLoader.php on line 56 and defined in C:\\wamp\\www\\projet\\src\\Intranet\\RhBundle\\Form\\AvatarFormType.php line 24"

When I began to search, I found a common error on the method in the repository. But maybe it's okay...

This is my ImageRepository :

public function getImageUser(User $user)
{
    $qb = $this->createQueryBuilder('i')
           ->where('i.user = :user ')
           ->setParameter('user', $user);

// Et on retourne simplement le QueryBuilder, et non la Query
return $qb;

}

This is my AvatarFormType :

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    //die(var_dump($options['data']));
    $builder
       ->add('avatar', 'entity', array(
            'class' => 'IntranetUserBundle:Image',
            'property' => 'alt',
           'query_builder' => function(ImageRepository  $r) use($options) {
                return $r->getImageUser($options['user']);}
            )
        );
}

The relation :

/**
 * @ORM\OneToOne(targetEntity="Intranet\UserBundle\Entity\Image", cascade={"persist", "remove"})
 * @Assert\Valid()
 */
private $avatar;

And this is my controller :

public function imagesDeAction(Request $request, User $user) {
    $form = $this->createForm(new AvatarFormType(), $user, array('user' => $user));
    $images = $this->getDoctrine()
    ->getRepository('IntranetUserBundle:Image')
    ->findByUser($user);
    if ($request->getMethod() == 'POST') {
        $form->handleRequest($request);
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $user->setAvatar($request->avatar);;
            $em->persist($user);
            $em->flush();
        }

    }
    $avatar = $user->getAvatar();
   return $this->render('IntranetRhBundle:Image:imagesDe.html.twig',array('user' => $user,'images' => $images, 'form' => $form->createView()));
}

Users have some pictures in there private directory and I want to choose an avatar. There is already a ManyToMany relation between User and Image and a OneToOne (as I noticed) between User and Image.

I'm trying to build a select list with only the pcitures of a specific user with the parameter. None of the solution I found is efficient to solve this error.

I'm not sure I have to call my function with use($options) and $options['data'] but with a var_dump I saw my User on $options['data'].

EDIT :

I bring a little precision : The ImageReposiroty seems to be not found although the use is ok. I don't have the error message "class not found". But if I put EntityReposirtoy the bug disappears and I have this symfony error message :

Expected argument of type "Doctrine\\ORM\\QueryBuilder", "array" given

But I know I have to call ImageRepository and not EntityRepository...

Thank's to @R. Canser Yanbakan who gave me an example, I solve myself my problem !

In my entity I have * @ORM\\Entity But for using reposiroty I have to call it like this :

* @ORM\Entity(repositoryClass="Intranet\UserBundle\Entity\ImageRepository")

The correct BuildForm is :

 /**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
       ->add('avatar', 'entity', array(
            'class' => 'IntranetUserBundle:Image',
            'property' => 'alt' ,
            'query_builder' => function(ImageRepository  $r) use($options) {
                                return $r->getImagesUser($options['user']);}
            )
        );
}

And the rigth createForm is :

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

$user to select the user's avatar, and the array for the parameter given at the query_builder

Avatar form type is expecting to data_class must be Intranet\\UserBundle\\Entity\\Image. But you are giving the User entity to the form. You have to give that user variable as an option.

$form = $this->createForm(new AvatarFormType(), new Image(), array('user_id' => $user->getId());

Than change your setDefaults to

public function setDefaultOptions(OptionsResolverInterface $resolver)
{ 
    $resolver->setDefaults(array('data_class' => 'Intranet\UserBundle\Entity\Image', 'user_id = false ));
}

Than you can get user_id variable like this:

'query_builder' => function(ImageRepository  $r) use($options) {
    return $r->getImageUser($options['user_id']);
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM