Php 从Symfony 4中的控制器捕获动态URL
我使用的是Symfony 4,捕获路由并将其定向到控制器方法的方法如下:Php 从Symfony 4中的控制器捕获动态URL,php,symfony,routes,Php,Symfony,Routes,我使用的是Symfony 4,捕获路由并将其定向到控制器方法的方法如下: /** * @Route("/my/route", name="name_of_route") */ public function myMethod() { /* some logic that render a view */ } 在我的应用程序中,我有一个购物车。让我们假设一个假设的例子,其中我有以下类别嵌套: Solid └>sand └>refined sand └>gro
/**
* @Route("/my/route", name="name_of_route")
*/
public function myMethod() {
/* some logic that render a view */
}
在我的应用程序中,我有一个购物车。让我们假设一个假设的例子,其中我有以下类别嵌套:
Solid
└>sand
└>refined sand
└>gross sand
...etc...
如果用户单击精炼砂,我想生成以下URL:
www.myWeb.com/solid/sand/refined-sand
问题是,既然这个URL是动态的,我如何用注释捕获它?也就是说,我不能做到以下几点:
/**
* @Route("/{category}/{subcategory}/{product}", name="name_of_route")
*/
public function myMethod() {
/* some logic that render a view */
}
因为我不知道类别有多少嵌套级别
我希望我的问题被理解 我建议创建一条全面覆盖的路线,例如:
public function catchAllAction($url)
{
// ...
}
然后,您可以将$url
拆分为/
字符上的段,并根据需要将类别与实体进行匹配
$categories = explode('/', $url);
在为路由使用注释时,需要确保这是应用程序中注册的最后一条路由,以防止它与其他路由错误匹配。您可以在routing.yml
config文件中执行此操作
app:
resource: '@AppBundle/Controller/'
type: annotation
catch_all:
path: /{url}
defaults: { _controller: AppBundle:Category:catchAll }
methods: [ GET ]
requirements:
url: '.+'
如果可能,我还建议在路由前面加前缀,以限制它可能匹配的路由模式。例如,
/categories/{url}
为什么不使用RouterListener
?要做到这一点,您需要多做一步。您需要允许/
作为路由中的有效字符,否则它将不匹配,因为路由器将把它作为分隔符,并查找与参数数量匹配的路由。这里有一个关于如何做到这一点的特殊文档条目:@Joe,喊得好。我已将路由参数要求添加到yaml文件中。