【发布时间】: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