【问题标题】:Unable to guess how to get a Doctrine instance from the request information无法从请求信息中猜出如何获取Doctrine实例
【发布时间】:2012-04-01 08:35:13
【问题描述】:

我收到“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)
{
  // ...
}

而且它不起作用,可能是因为 Doctrine 2 不能“猜测”......那么我如何让 Doctrine 2 猜测,嗯?

【问题讨论】:

标签: php symfony doctrine-orm


【解决方案1】:

Doctrine 不知道如何使用请求参数来查询函数签名中指定的实体。

您需要通过指定一些映射信息来帮助它:

/**
  * @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)
{
  // ...
}

【讨论】:

    【解决方案2】:
    /**
     * @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)
    

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

        【解决方案4】:

        @Route 注解签名上的参数必须与实体字段匹配,以便 Doctrine 自动进行转换。

        否则,您需要使用注释 @ParamConverter 手动进行转换,因为它在其他响应中提到。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 如何在 YAML 配置文件中使用 @paramConverter?
          • @paramConverter 由 SensioFrameworkExtraBundle 实现。我不认为捆绑包通过 yml o xml 配置文件公开此功能,我认为唯一的方法是使用注释。
          猜你喜欢
          • 2019-08-05
          • 2021-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-14
          • 2021-01-20
          • 2016-05-03
          • 1970-01-01
          相关资源
          最近更新 更多