【问题标题】:Silex 2: RegEx in routingSilex 2:路由中的正则表达式
【发布时间】:2016-08-19 18:07:17
【问题描述】:

是否可以在 Silex 2 路由中使用 RegEx?

我需要这样做:

$this->get('/(adios|goodbay)', function (Request $request) use ($app) {
    return $app['twig']->render('bye.html.twig', []);
})->bind('bye');

【问题讨论】:

    标签: php regex routing silex


    【解决方案1】:

    正如 Thomas 所说,是的,您可以。文档的重要部分是route requirements

    在某些情况下,您可能只想匹配某些表达式。您可以通过在路由方法返回的 Controller 对象上调用 assert 来使用正则表达式来定义需求。

    例如:

    $app->get('/blog/{postId}/{commentId}', function ($postId, $commentId) {
        // ...
    })
    ->assert('postId', '\d+')
    ->assert('commentId', '\d+');
    

    因此,在您的情况下,路线的定义类似于:

    $this->get('/{bye}', function (Request $request) use ($app) {
        return $app['twig']->render('bye.html.twig', []);
    })
    ->assert('bye', '^(adios|goodbye)$')
    ->bind('bye');
    

    如果你也想知道参数的值,直接传给控制器即可(参数名称必须与路由定义中的参数名称一致):

    $this->get('/{bye}', function (Request $request, $bye) use ($app) {
        if ($bye === 'adios') {
          $sentence = "eso es todo amigos!";
        }
        else {
          $sentence = "that's all folks!";
        }
    
        return $app['twig']->render('bye.html.twig', ["sentence" => $sentence]);
    })
    ->assert('bye', '^(adios|goodbye)$')
    ->bind('bye');
    

    【讨论】:

    • 而且,是否可以从闭包函数中知道它是否已使用'adios'或'goodbye'调用?谢谢
    • 我一直在考虑从 Silex 迁移到 Symfony(主要是因为我对 Silex 缺乏了解),但我逐渐发现几乎可以用 Symfony 轻松完成任何事情。跨度>
    • @CarlosAlbertoMartínezGadea,请记住,截至 2018 年 Genuary the EOL for Silex has been anounced。您应该尝试迁移到 SF4。这是unofficial guide
    • @mTorres 非常感谢您让我知道这篇文章。我应该继续发布这类新闻,当然。那时我会继续使用 Symfony 4,因为我正处于项目的开始阶段,现在这样做很有意义,而不是遭受缺乏支持和未来补丁/维护的痛苦。
    【解决方案2】:

    鉴于docPage 8

    在 Silex 中,您定义一个路由和匹配该路由时调用的控制器。路由模式包括:

    • Pattern :路由模式定义了指向资源的路径。该模式可以包含可变部分,您可以为它们设置 RegExp 要求。

    所以我想说可以像你在问题中那样使用正则表达式。

    【讨论】:

    • 谢谢!我试过这个“/(adios|goodbay)/”,但它不起作用,你能帮帮我吗?
    • @cybtow,你能用“它不起作用”详细说明吗?您收到 404 的 HTTP 状态是什么?您是否检查过 Silex 日志(假设您已启用“调试”并在开发期间应使用独白)?
    • 这是 RouterListener.php 第 125 行中显示的 NotFoundHttpException 错误:当我使用以下任何路由时,未找到“GET /adios”的路由:$this->get('^/(adios| goodbay)/$', $this->get('/^(adios|goodbay)$/', $this->get('/(adios|goodbay)/'。谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2019-01-01
    • 2014-04-14
    • 2012-09-23
    相关资源
    最近更新 更多