Php Symfony2路由-一个slug两个不同的路由和条令实体

Php Symfony2路由-一个slug两个不同的路由和条令实体,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,在我的Symfony2应用程序中,我有两个不同的原则实体,两个实体都有slug值,我希望根据这两个值进行路由。我使用注释。示例URL如下所示: 正如您可以看到的,两个URL都有一个slug,这些slug从不重叠,基于slug,我想在我的控制器中调用一个操作 如果我在这两个URL前面加上路由前缀或id,我可以区分它们,但我不想这样做;我只想留一个鼻涕虫 我可以在控制器内的单个操作中完成这项工作,首先手动检测对一个实体的匹配,如果不存在,则将其与另一个实体进行匹配。我想知道的是,是否有更好的

在我的Symfony2应用程序中,我有两个不同的原则实体,两个实体都有slug值,我希望根据这两个值进行路由。我使用注释。示例URL如下所示:

正如您可以看到的,两个URL都有一个slug,这些slug从不重叠,基于slug,我想在我的控制器中调用一个操作

如果我在这两个URL前面加上路由前缀或id,我可以区分它们,但我不想这样做;我只想留一个鼻涕虫

我可以在控制器内的单个操作中完成这项工作,首先手动检测对一个实体的匹配,如果不存在,则将其与另一个实体进行匹配。我想知道的是,是否有更好的方法,比如使用不同的路由参数(我用@ParamConverter尝试过,但没有运气)

这是我现在拥有的代码,它永远不会到达第二个action(),第一个action总是被触发

第一个动作:

* @Route("/{_locale}/{deal}/{city_slug}/{page}", defaults={"page"=1}, requirements={
 *    "_locale": "en|tm",
 *    "page": "\d+",
 *    "deal": "value1|value2"
 * }, name="deal_cities")
 *
 */
public function cityAction($page, $city_slug, $deal=null){
  ...
}
* @Route("/{_locale}/{deal}/{item_slug}/{page}", defaults={"page"=1}, requirements={
     *    "_locale": "en|tm",
     *    "page": "\d+",
     *    "deal": "value1|value2"
     * }, name="deal_items")
     *
     */
    public function itemAction($page, $item_slug, $deal=null){
      ...
    }
   ...
  * @ParamConverter("city", options={"mapping": {"city_slug": "slug"}})
     *
     */
    public function cityAction($page, City $city, $deal=null){
     ....
    }
同一控制器内的第二个操作:

* @Route("/{_locale}/{deal}/{city_slug}/{page}", defaults={"page"=1}, requirements={
 *    "_locale": "en|tm",
 *    "page": "\d+",
 *    "deal": "value1|value2"
 * }, name="deal_cities")
 *
 */
public function cityAction($page, $city_slug, $deal=null){
  ...
}
* @Route("/{_locale}/{deal}/{item_slug}/{page}", defaults={"page"=1}, requirements={
     *    "_locale": "en|tm",
     *    "page": "\d+",
     *    "deal": "value1|value2"
     * }, name="deal_items")
     *
     */
    public function itemAction($page, $item_slug, $deal=null){
      ...
    }
   ...
  * @ParamConverter("city", options={"mapping": {"city_slug": "slug"}})
     *
     */
    public function cityAction($page, City $city, $deal=null){
     ....
    }
我也尝试了使用ParamConverter,但第二个操作没有成功:

* @Route("/{_locale}/{deal}/{city_slug}/{page}", defaults={"page"=1}, requirements={
 *    "_locale": "en|tm",
 *    "page": "\d+",
 *    "deal": "value1|value2"
 * }, name="deal_cities")
 *
 */
public function cityAction($page, $city_slug, $deal=null){
  ...
}
* @Route("/{_locale}/{deal}/{item_slug}/{page}", defaults={"page"=1}, requirements={
     *    "_locale": "en|tm",
     *    "page": "\d+",
     *    "deal": "value1|value2"
     * }, name="deal_items")
     *
     */
    public function itemAction($page, $item_slug, $deal=null){
      ...
    }
   ...
  * @ParamConverter("city", options={"mapping": {"city_slug": "slug"}})
     *
     */
    public function cityAction($page, City $city, $deal=null){
     ....
    }

感谢您的建议。

所有Symfony仅通过请求获取字符串
/path/slug
。在不检查db或其他数据存储的情况下,您希望它如何理解是城市还是其他?我理解,这就是为什么我想知道是否有一种方法,可能是使用正确的ParamConverter或其他方法,以防我误解。您可以添加额外的db表,带有slug、实体类型、实体id,并使前端控制器重定向到另一个实体id参数。我有一个适合我的工作解决方案,我捕获slug,并在单个action()中解释它。我想知道在Symfony中是否存在问题中所述的方法。您是否尝试使用yml进行此操作?所有Symfony仅通过请求获取字符串
/path/slug
。在不检查db或其他数据存储的情况下,您希望它如何理解是城市还是其他?我理解,这就是为什么我想知道是否有一种方法,可能是使用正确的ParamConverter或其他方法,以防我误解。您可以添加额外的db表,带有slug、实体类型、实体id,并使前端控制器重定向到另一个实体id参数。我有一个适合我的工作解决方案,我捕获slug,并在单个action()中解释它。我想知道在Symfony是否存在一种问题中描述的方法。您是否尝试过使用yml?