Symfony2形式带参数的query_builder

Dey*_*nis 1 php forms symfony doctrine-orm

我有这个错误:

“可捕获的致命错误:传递给Intranet \ RhBundle \ Form \ AvatarFormType :: Intranet \ RhBundle \ Form {closure}()的参数1必须是Intranet \ UserBundle \ Entity \ ImageRepository的实例,给定的Doctrine \ ORM \ EntityRepository的实例,在第56行的C:\ wamp \ www \ projet \ vendor \ symfony \ symfony \ src \ Symfony \ Bridge \ Doctrine \ Form \ ChoiceList \ ORMQueryBuilderLoader.php中调用,并在C:\ wamp \ www \ projet \ src \ Intranet中定义\ RhBundle \ Form \ AvatarFormType.php第24行“

当我开始搜索时,在存储库中的方法上发现了一个常见错误。但是也许没关系...

这是我的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;
Run Code Online (Sandbox Code Playgroud)

}

这是我的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']);}
            )
        );
}
Run Code Online (Sandbox Code Playgroud)

关系:

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

这是我的控制器:

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()));
}
Run Code Online (Sandbox Code Playgroud)

用户在那里的私人目录中有一些图片,我想选择一个头像。用户与图像之间已经存在ManyToMany关系,而用户与图像之间已经存在一个OneToOne(我注意到)。

我正在尝试仅使用具有参数的特定用户的名单来建立选择列表。我发现的解决方案都无法有效解决此错误。

我不确定是否必须使用use($ options)和$ options ['data']调用函数,但是使用var_dump时,我在$ options ['data']上看到了我的用户。

编辑:

我带来一点精度:尽管可以使用,但似乎找不到ImageReposiroty。我没有错误消息“找不到类”。但是,如果我放EntityReposirtoy,该错误就会消失,并且出现以下symfony错误消息:

给定类型为“ Doctrine \ ORM \ QueryBuilder”,“ array”的预期参数

但是我知道我必须调用ImageRepository而不是EntityRepository ...

Dey*_*nis 5

感谢@R。坎瑟·扬巴坎(Canser Yanbakan)给了我一个例子,我自己解决了我的问题!

在我的实体中,我有* @ORM \ Entity,但是要使用reposiroty,我必须这样称呼它:

* @ORM\Entity(repositoryClass="Intranet\UserBundle\Entity\ImageRepository")
Run Code Online (Sandbox Code Playgroud)

正确的Bui​​ldForm是:

 /**
 * @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']);}
            )
        );
}
Run Code Online (Sandbox Code Playgroud)

严格的createForm是:

$form = $this->createForm(new AvatarFormType(), $user, array('user' => $user));
Run Code Online (Sandbox Code Playgroud)

$ user选择用户的头像,并在query_builder中指定参数的数组