【问题标题】:Symfony2 form query_builder with parameterSymfony2 表单 query_builder 带参数
【发布时间】:2014-05-19 13:49:58
【问题描述】:

我有这个错误:

“可捕获的致命错误:传递给 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;

}

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

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

我正在尝试构建一个选择列表,其中仅包含带有参数的特定用户的图片。我找到的解决方案都无法有效解决此错误。

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

编辑:

我带来了一点精确性: 尽管使用还可以,但似乎找不到 ImageReposiroty。我没有错误消息“找不到类”。 但是如果我把 EntityReposirtoy 放进去,这个错误就会消失,并且我有这个 symfony 错误消息:

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

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

【问题讨论】:

  • 好的基本问题是表单期望您提供 ImageRepository 实体,但您将 EntityRepository 提供给它。你有任何 data_class 选项吗?
  • 我有这个,没有别的: /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Intranet \UserBundle\Entity\Image' )); }

标签: php forms symfony doctrine-orm


【解决方案1】:

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

在我的实体中,我有 * @ORM\Entity 但是为了使用存储库,我必须这样称呼它:

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

正确的 BuildForm 是:

 /**
 * @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']);}
            )
        );
}

而正确的 createForm 是:

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

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

【讨论】:

    【解决方案2】:

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

    $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']);
    })
    

    【讨论】:

    • 我的建议有这个错误:尝试从 C:\wamp\www\projet\src\ 中的命名空间“Intranet\RhBundle\Controller\Intranet\UserBundle\Entity”加载类“Image” Intranet\RhBundle\Controller\ImageController.php 第 15 行。您是否需要从另一个命名空间“使用”它?也许您需要为以下之一添加 use 语句:Symfony\Component\Validator\Constraints\Image。我尝试按用户切换 user_id 并且错误是相同的,所以也许我可以使用该实体。但是要修复这个错误,我不知道需要使用什么。已经有“使用Intranet\UserBundle\Entity\Image;”
    • 您正在尝试从控制器目录加载实体。检查控制器第一行的命名空间。您可以使用该实体并像表单上的 Image() 一样简短地调用它。发送您的控制器的完整屏幕截图或将其粘贴到服务上,以便我们查看完整代码并为您提供帮助。
    • 如果没有“new Intranet\UserBundle\Entity\Image()”,我的错误与第一个相同。这是我的控制器和我的 fodders 的屏幕:hpics.li/7e2239f。不要关心供应商和网络文件夹上的错误和警告,我的 php 解释器太旧了。
    • 只需将 new Image() 添加到第 18 行。删除完整引用。您确实已经将参考放在第 10 行。
    • 我在测试您的提议时看到错误时已经这样做了。并且在同一行有与第一个相同的错误消息。
    猜你喜欢
    • 2012-11-30
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多