ParamConverter可选但有效

时间:2016-05-26 08:40:10

标签: php annotations symfony

我正在尝试使用ParamConverter作为可选参数

/**
 * @Route("/item", name="item_new")
 * @Route("/item/{id}", name="item")
 * @ParamConverter("item", class="AppBundle:Item")
 */
public function stepStockReceptionAction(Item $item = null)
{
    return new Response($item ? $item->getName() : 'New item');
}

我的$item现在是可选的,但如果我提供了无效的商品ID,则只会将其视为null

GET /item/42 # <-- Non existant item

给出

  

新项目

如果该项目不存在,如何才能出现默认的404错误?

1 个答案:

答案 0 :(得分:2)

documentation

所述
  

引擎盖下发生了几件事:

     

转换器试图从中获取一个SensioBlogBu​​ndle:Post对象   请求属性(请求属性来自路径占位符    - 这里是id);

     

如果未找到Post对象,则生成404响应;

因此无论您如何定义Route和ParamConverter,它都会从请求中获取id并尝试使用此id查找Item。所以你有两个选择

  1. 分为两种方法,一种用于创建,另一种用于使用现有项目
  2. 使用类似的东西:
  3. 
    /**
     * @Route("/item/{id}", defaults={"id"=null}, name="work_with_item")
     */
    public function stepStockReceptionAction(Request $request)
    {
        $item = $this->getDoctrine()->getRepository('AppBundle:Project')->find($request->query->get('id')); 
    
        return new Response($item ?  $item->getName() : 'New item');
    }