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猜测,以及?
6条答案
按热度按时间dwbf0jvd1#
Doctrine不知道如何使用请求参数来查询函数签名中指定的实体。
您需要通过指定一些Map信息来帮助它:
bybem2ql2#
我在paramconverter的文档中没有找到任何帮助,因为它没有描述它是如何工作的,它如何使用多个参数和东西进行猜测。另外,我不确定是否需要它,因为我刚刚写的工作正常。
我的错误是没有使用我的属性名称,所以教义无法猜对。我将{player_name}改为{name},将{gather_id}改为{id}。
然后我将我的id在它们的实体中的名称从“id”改为“id_gather”和“id_player”,所以我现在可以这样做了:
这比我们想象的
现在我在想我该怎么做
xiozqbni3#
试试这个:
pqwbnv8z4#
@Route注解的签名上的参数必须匹配实体字段,以便Doctrine自动进行转换。
否则,您需要使用注解@ParamConverter手动进行转换,因为它在其他响应中提到。
y3bcpkx15#
@1ed是对的,你应该定义一个@paramConverter来获得一个Player示例或一个Gather示例。
iqih9akk6#
从symfony 6.2开始,SensioFrameworkExtraBundle被弃用。annotation routing,param conversion等功能现在直接集成在Symfony中。
请注意,ParamConverter现在称为ValueResolver
您需要在Symfony > 6.2,PHP >= 8.1和DoctrineBundle >= 2.7.1
现在可以轻松地将IDMap到实体:
默认情况下,此行为被激活,并且可以通过
doctrine.orm.controller_resolver.auto_mapping
为false来禁用。如果你以不同的方式获取对象,例如通过另一个属性,而不是使用SensioFrameworkExtraBundle中的
ParamConverter
,你现在可以使用#[MapEntity]
php属性。上面发布的链接中的示例在使用slug查找实体时将ParamConverter替换为MapEntity:
变成:
MapEntity有很多其他有用的选项。
请参阅有关自动获取对象(AutoValueResolver)的文档