如何使用Slim框架设置不区分大小写的路由?

时间:2013-11-13 12:31:06

标签: php routes slim

我的应用程序中的路由和回调之间存在以下关联:

$api->slim->post('/:accountId/Phone-Numbers/', function($accountId) use ($api) {
    $api->createPhoneNumber($accountId);
});

我想避免的是让路由myhost/a7b81cf/phone-numbers/返回404响应,因为Slim将路由myhost/a7b81cf/Phone-Numbers/理解为不同,因为使用了大写字母。 如何避免设置两个触发相同回调函数的独立路由?

3 个答案:

答案 0 :(得分:5)

这是一个老问题,但我想为这个问题提供一个明确的答案。

有一个'routes.case_sensitive'配置允许你这样做。我不确切地知道为什么这不在文档中(http://docs.slimframework.com/#Application-Settings),但是如果你看一下框架的源代码(特别是在Slim.php的getDefaultSettings()中),你可以看到它就在那里。 / p>

我刚刚测试过,它运行正常。

总结一下,解决方案是应用'routes.case_sensitive'配置,如下所示:

$configurations = [
    // ... other settings ...
    'routes.case_sensitive' => false
];

$app->config($configurations);

答案 1 :(得分:0)

您可以尝试使用路线验证/条件:

$api->slim->post('/:accountId/:phoneNumbers/', function ($accountId) {
    $api->createPhoneNumber($accountId);
})->conditions(array('phoneNumbers' => '(p|P)hone\-(n|N)umbers'));

或者,如果您想要更多全局更改,您可以覆盖Route类中的Route->匹配方法,区分大小写,但它会影响整个应用程序。

答案 2 :(得分:0)

您可以通过注册一个钩子并修改传入的路由以匹配您定义的路由的情况,在Slim中模仿不区分大小写的路由。

在该示例中,所有已定义的路由都应为小写,并在所有传入路径上调用strtolower

$app->hook('slim.before.router', function () use ($app) {
    $app->environment['PATH_INFO'] = strtolower($app->environment['PATH_INFO']);
});