Slim Framework如何在拦截器中按名称捕获路由参数

时间:2018-07-28 05:40:06

标签: php slim

我正在使用Slim框架的v2。大多数API的格式如下:

https://abcXX.com/:version/customer/:CustomerID/XXX/ ....

因此,几乎所有的API都有URL中提供的:version和:CustomerID。

我正在像这样编写一个联播,并且想知道是否有任何方法可以在联播功能中全局拦截它

public function call()
{

    $this->app->hook('slim.before.dispatch', array($this, 'onBeforeDispatch'));
    $this->next->call();
}

public function onBeforeDispatch()
{
    $this->app->is_development_environment = IS_DEVELOMPENT_ENVIRONMENT;
    $route_params = $this->app->router()->getCurrentRoute()->getParams();
    $param_version = ???
}

我不知道如何从URL参数获取:version的值。如果可以的话,我可以在最顶层进行一些全局处理,而不必在每个API处理函数中编写代码。

请提出建议。

2 个答案:

答案 0 :(得分:1)

我建议避免使用钩子来确定要调用的API版本。请考虑使用grouping routes
而且我建议使用中间件代替钩子,除非您确实需要钩子,否则它们本质上是不同的。

无论如何,如果您想使用钩子,请参见以下示例:

<?php
require_once ('../vendor/autoload.php');

$app = new \Slim\Slim();

$app->hook('slim.before.dispatch', function() use($app){
    $params = $app->router()->getCurrentRoute()->getParams();
    // Use $params['version'] to do what you want
    print "<pre>";
    print_r($params);
    print "</pre>";

});

$app->get('/:version/hello/:name', function ($version, $name) {
        print "Hello, " . $name;
});

$app->get('/:version/customer/:CustomerID/XXX', function($version, $customerId){
    print "Customers route";
});

$app->run();

现在,如果您打开<host address>/2.1/hello/foo<host address>/2.1/customer/1000/XXX,则在两种情况下都将在['version'] => 2.1中看到$params
但是,如果采用这种方法,我认为您应该定义所有的路由回调,以接受$version作为它们的第一个参数,这绝对是不必要和多余的,并且会使代码处理更加困难。但是,如果您对路线进行分组,那么您将拥有类似的东西:

$app->group('/2.1', function () use ($app {
    $app->get('/hello/:name', function ($name) {});
    $app->get('/customer/:CustomerID/XXX', function($customerId){});
});

更干净,不需要额外的努力。

答案 1 :(得分:-1)

使用回调函数或创建函数以获取类似的参数:-

$app->get('/books/:one/:two', function ($one, $two) {
    echo "The first parameter is " . $one;
    echo "The second parameter is " . $two;
});