symfony 无法猜测如何从请求信息中获取Doctrine示例

cunj1qz1  于 2023-10-24  发布在  其他
关注(0)|答案(6)|浏览(143)

500 Internal Server Error - LogicException:Unable to guess how to get a Doctrine instance from the request information.
下面是我的控制器的动作定义:

/**
 * @Route("/gatherplayer/{player_name}/{gather_id}")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)
{
  // ...
}

它不起作用,可能是因为教义2不能“猜测”.那么我如何使教义2猜测,以及?

dwbf0jvd

dwbf0jvd1#

Doctrine不知道如何使用请求参数来查询函数签名中指定的实体。
您需要通过指定一些Map信息来帮助它:

/**
  * @Route("/gatherplayer/{player_name}/{gather_id}")
  *
  * @ParamConverter("player", options={"mapping": {"player_name" : "name"}})
  * @ParamConverter("gather", options={"mapping": {"gather_id"   : "id"}})
  *
  * @Template()
  */
public function createAction(Player $player, Gather $gather)
{
  // ...
}
bybem2ql

bybem2ql2#

/**
 * @Route("/gatherplayer/{name}/{id}")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)

我在paramconverter的文档中没有找到任何帮助,因为它没有描述它是如何工作的,它如何使用多个参数和东西进行猜测。另外,我不确定是否需要它,因为我刚刚写的工作正常。
我的错误是没有使用我的属性名称,所以教义无法猜对。我将{player_name}改为{name},将{gather_id}改为{id}。
然后我将我的id在它们的实体中的名称从“id”改为“id_gather”和“id_player”,所以我现在可以这样做了:

/**
 * @Route("/gatherplayer/{id_player}/{id_gather}")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)

这比我们想象的

* @Route("/gatherplayer/{id}/{id}")

现在我在想我该怎么做

/**
  * @Route("/gatherplayer/{player}/{gather}")
  * @Template()
  */
 public function deleteAction(Gather_Player $gather_player)
xiozqbni

xiozqbni3#

试试这个:

/**
 * @Route("/gatherplayer/{player_name}/{gather_id}")
 * @ParamConverter("player", class="YourBundle:Player")
 * @ParamConverter("gather", class="YourBundle:Gather")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)
pqwbnv8z

pqwbnv8z4#

@Route注解的签名上的参数必须匹配实体字段,以便Doctrine自动进行转换。
否则,您需要使用注解@ParamConverter手动进行转换,因为它在其他响应中提到。

y3bcpkx1

y3bcpkx15#

@1ed是对的,你应该定义一个@paramConverter来获得一个Player示例或一个Gather示例。

iqih9akk

iqih9akk6#

从symfony 6.2开始,SensioFrameworkExtraBundle被弃用。annotation routing,param conversion等功能现在直接集成在Symfony中。
请注意,ParamConverter现在称为ValueResolver

您需要在Symfony > 6.2,PHP >= 8.1和DoctrineBundle >= 2.7.1

现在可以轻松地将IDMap到实体:

#[Route('/post/{id}')]
public function show(Post $post): Response
{
    //  $post is a Post entity
}

默认情况下,此行为被激活,并且可以通过doctrine.orm.controller_resolver.auto_mapping为false来禁用。
如果你以不同的方式获取对象,例如通过另一个属性,而不是使用SensioFrameworkExtraBundle中的ParamConverter,你现在可以使用#[MapEntity] php属性。
上面发布的链接中的示例在使用slug查找实体时将ParamConverter替换为MapEntity:

#[ParamConverter('post', options: ['mapping' => ['postSlug' => 'slug']])]
public function addComment(Request $request, Post $post): Response

变成:

use Symfony\Bridge\Doctrine\Attribute\MapEntity;
public function addComment(
    Request $request,
    #[MapEntity(mapping: ['postSlug' => 'slug'])] Post $post
): Response

MapEntity有很多其他有用的选项。
请参阅有关自动获取对象(AutoValueResolver)的文档

相关问题