Symfony2使用参数形成query_builder

时间:2014-05-19 13:49:59

标签: php forms symfony doctrine-orm

我有这个错误:

“可捕获的致命错误:传递给Intranet的参数1 \ RhBundle \ Form \ AvatarFormType :: Intranet \ RhBundle \ Form {closure}()必须是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;

}

这是我的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']);}
            )
        );
}

关系:

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

这是我的控制者:

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()));
}

用户在私人目录中有一些图片,我想选择一个头像。 用户和图像之间已存在ManyToMany关系,并且用户和图像之间存在OneToOne(我注意到)。

我正在尝试使用参数构建一个只包含特定用户的pcitures的选择列表。我找到的解决方案都无法有效解决此错误。

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

编辑:

我带来一点精度: 虽然使用没问题,但似乎找不到ImageReposiroty。我没有错误消息“class not found”。 但是如果我把EntityReposirtoy放进去,那么bug就会消失,而且我有这个symfony错误消息:

  

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

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

2 个答案:

答案 0 :(得分:4)

感谢@R。 Canser Yanbakan给了我一个例子,我解决了自己的问题!

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

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

正确的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']);}
            )
        );
}

而且创建的形式是:

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

$ user选择用户的头像,以及query_builder中给出的参数数组

答案 1 :(得分:0)

Avatar表单类型期望data_class必须是Intranet \ UserBundle \ Entity \ Image。但是您将用户实体提供给表单。您必须将该用户变量作为选项。

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

将setDefaults更改为

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

你可以像这样得到user_id变量:

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