【问题标题】:Symfony 2, Is it possible to define route with condition?Symfony 2,是否可以根据条件定义路由?
【发布时间】:2015-11-06 19:19:02
【问题描述】:

我想在控制器中使用 if..else 语句执行操作,该语句分析路由并采取相应措施。这可能吗?

路线:blog\post\{tag} or blog\post. tag 是一个数组,因此很可能它看起来像 ?tag=1,2,3,4,51

controller action diplaypost()
{
if (!isset($_GET['tag'])) {do smth; //case of route blog\post}
else {do smth; //case of route blog\post\{tag} }
}

【问题讨论】:

标签: php symfony routes


【解决方案1】:

您可以通过这种方式获取当前路线的名称:

$route = $request->attributes->get('_route');

您现在可以将$route 用于您需要的任何逻辑。

【讨论】:

    【解决方案2】:

    您想对每条路线做什么(您正在执行的操作是什么)?第一个是按标签过滤帖子列表,而第二个只是显示所有帖子?实际上,这是两条通往同一行动的路线,并将被定义为

    blog_post:
        path: blog/post
        defaults: { _controller: YourController:YourAction, tag: null }
    
    blog_post_tag:
        path: blog/post/{tag}
        defaults: { _controller: YourController:YourAction }
    

    那么您的控制器操作将是:

    public function yourAction($tag = null)
    {
        if ($tag === null) {
            // something
        } else {
            // something else
        }
    }
    

    虽然@Elnur Abdurrakhimov 的回答是正确的,但这样做通常表明代码有异味,应尽可能避免。

    同样在你的例子中,你使用了超级全局 $_GET,你不应该在 Symfony 2 中这样做,而应该使用 Request 对象。 See the documentation 了解如何在控制器方法中执行此操作。

    【讨论】:

    • 你真的不需要分开这些路线。您可以只拥有一个并且仍然可以正常工作
    • 如何使这个is标签是一个数组?很可能在 URL 中看起来像 ?tag=1,2,3,4,51
    • 您只能通过编写自己的ParamConverter 来自动执行此操作。更简单地说,只需在您的操作中执行$tags = explode(',', $tag)。通过查询参数传递数组本身有点笨拙,例如?tag[]=1&tag=[]2&tag[]=3.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多