【问题标题】:Advanced routing in Symfony v3Symfony v3 中的高级路由
【发布时间】:2018-08-07 06:22:00
【问题描述】:

我正在使用自定义路由方法,因此我可以通过单个控制器操作处理以下链接:

/q-query_term
/category-category_name/city-city_name/q-query_term
/city-city_name/category-category_name/q-query_term
/city-city_name/q-query_term
/category-category_name/q-query_term
/city-city_name
/category-category_name

有可能吗?我不使用SensioExtraBundle,所以路由必须写在yaml中。

例如,在 Zend Framework 2 中,这很容易实现,因为我可以编写一个类,它可以根据需要处理路由。虽然不知道如何在 Symfony 中实现相同的功能,但我们将不胜感激。

我能想到的唯一方法是创建一个自定义路由加载器,计算所有路由排列并返回该集合,但不知道这是否是最好的解决方案。

这个问题很独特,因为我需要使用单个路由名称而不是指定数十个不同的路由定义。

【问题讨论】:

  • 感谢您的意见,但我去过那里,答案根本无法解决我的问题。
  • 我们能知道为什么你需要一个单一的路线名称或/以及为什么你不能用/q-Houses?city_name=NewYork 来理解上下文吗
  • 包罗万象的路线适合您吗?然后您可以在控制器内部进行处理。
  • @goto 因为 SEO,最终我希望有像 /from-chicago/in-flats/find-room/in-music/find-artist 这样的网址。
  • @lxg 我想这必须做,听起来是个好主意

标签: php symfony routing url-routing symfony-3.4


【解决方案1】:

一个简单的解决方案是将路线定义为包罗万象……

# Resources/config/routing.yml

catch_all:
    path:  /{path}
    defaults: { _controller: FooBarBundle:Catchall:dispatcher, path : "" }
    requirements:
        path: ".*"

…并在控制器中进行所有进一步的处理:

# Controller/CatchallController.php

class CatchallController extends Controller
{
    public function dispatcherAction(Request $request, string $path)
    {
        if (/* path matches pattern 1 */)
            return $this->doQuery($request, $path);
        elseif (/* path matches pattern 2 */)
            return $this->doCategoryCityQuery($request, $path);

        // ... and so on

        else
            return new Response("Page not found", 404);
    }

    private function doQuery($request, $path)
    {
        // do stuff and return a Response object
    }

    private function doCategoryCityQuery($request, $path)
    {
        // do stuff and return a Response object
    }
}

【讨论】:

  • 必须这样做。谢谢!我真的很失望没有像 ZF2/3 has to offer 这样灵活的方式。
猜你喜欢
  • 2019-11-24
  • 2010-12-23
  • 2014-10-28
  • 2011-09-02
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多