Symfony v3 中的高级路由

Advanced routing in Symfony v3

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

/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 中,这很容易实现,因为我可以编写一个 class,它可以按需要处理路由。虽然不知道如何在 Symfony 中实现相同的功能,但我们将不胜感激。

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

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

一个简单的解决方案是将路线定义为 catch-all …

# 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
    }
}