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 ...
感谢@R。坎瑟·扬巴坎(Canser Yanbakan)给了我一个例子,我自己解决了我的问题!
在我的实体中,我有* @ORM \ Entity,但是要使用reposiroty,我必须这样称呼它:
* @ORM\Entity(repositoryClass="Intranet\UserBundle\Entity\ImageRepository")
Run Code Online (Sandbox Code Playgroud)
正确的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']);}
)
);
}
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中指定参数的数组
| 归档时间: |
|
| 查看次数: |
7815 次 |
| 最近记录: |