Php 从Symfony 4中的控制器捕获动态URL

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

我使用的是Symfony 4,捕获路由并将其定向到控制器方法的方法如下:

/**
 * @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文件中。