【问题标题】:Catch a dynamic URL from controller in Symfony 4在 Symfony 4 中从控制器捕获动态 URL
【发布时间】:2018-01-16 05:56:29
【问题描述】:

我正在使用 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...

如果用户点击精砂,我想生成如下网址:

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 */
}

因为我不知道该类别有多少嵌套级别。

我希望我的问题得到理解。

【问题讨论】:

  • 你为什么不用RouterListener

标签: php symfony routes


【解决方案1】:

我建议创建一条包罗万象的路线,例如:

public function catchAllAction($url) 
{
    // ...
}

然后您可以将$url 拆分为/ 字符上的段,并根据需要将类别与您的实体进行匹配。

$categories = explode('/', $url);

当您为路由使用注释时,您需要确保这是您的应用程序中注册的最后一个路由,以防止它错误地匹配其他路由。您可以在 routing.yml 配置文件中执行此操作。

app:
    resource: '@AppBundle/Controller/'
    type: annotation

catch_all:
    path: /{url}
    defaults: { _controller: AppBundle:Category:catchAll }
    methods: [ GET ]
    requirements:
        url: '.+'

如果可能,我还建议为路由添加前缀以限制它可能匹配的路由模式。例如。 /categories/{url}

【讨论】:

  • 要做到这一点,您需要再采取一步。您需要允许 / 作为路由中的有效字符,否则它将不匹配,因为路由器会将其作为分隔符并查找与参数数量匹配的路由。有一个关于如何做到这一点的特殊文档条目:symfony.com/doc/current/routing/slash_in_parameter.html
  • @Joe,好声音。我在 yaml 文件中添加了路由参数要求。
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
相关资源
最近更新 更多