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
}
}
我正在使用自定义路由方法,因此我可以通过单个控制器操作处理以下链接:
/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
}
}