Symfony v3中的高级路由

时间:2018-02-27 14:50:09

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

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

/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中实现同样的目标,任何帮助都会受到赞赏。

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

这个问题是独一无二的,因为我需要使用单一路线名称而不是规定数十种不同的路线定义。

1 个答案:

答案 0 :(得分: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
    }
}