我有这个错误:
“可捕获的致命错误:传递给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 ......
答案 0 :(得分:4)
感谢@R。 Canser Yanbakan给了我一个例子,我解决了自己的问题!
在我的实体中我有* @ORM \ Entity但是对于使用reposiroty我必须这样称呼它:
* @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']);}
)
);
}
而且创建的形式是:
$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']);
})