Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Slim框架如何在拦截器中按名称捕获路由参数_Php_Slim - Fatal编程技术网

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

Php Slim框架如何在拦截器中按名称捕获路由参数,php,slim,Php,Slim,我正在使用Slim框架的v2。大多数API的格式如下: 因此,几乎所有的API都有:version和:CustomerID,这是URL中提供的 我正在写一个这样的连接,想知道是否有任何方法可以在连接函数中全局拦截它 public function call() { $this->app->hook('slim.before.dispatch', array($this, 'onBeforeDispatch')); $this->next->call()

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

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

我正在写一个这样的连接,想知道是否有任何方法可以在连接函数中全局拦截它

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参数中获取:版本的值。如果我能做到这一点,我就能够在最顶层进行一些全局处理,而不必在每个API处理函数中编写代码


请建议如何执行此操作。

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

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

我建议避免使用钩子来确定调用哪个版本的API。换个角度考虑。 我建议使用中间件而不是钩子,除非你真的需要钩子,它们本质上是不同的

无论如何,如果您想使用钩子,下面是一个如何使用钩子的示例:

<?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();

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

你有没有考虑写A?我做的是@仁摩。然而,我希望避免为每条路由编写中间件。我已经有400多个API了。有更简单的方法吗?您可以使用
$app->add()
向应用程序添加中间件(而不是特定的路由)。阅读更多。我如何阅读论点:里面的版本?若你们注意到我上面的代码片段,它实际上是我添加到应用程序中的一个中间件。我不知道如何得到参数:version(和类似的:customerID)@nima:这会起作用吗$路由参数=$this->app->router()->getCurrentRoute()->getParams();
$app->group('/2.1', function () use ($app {
    $app->get('/hello/:name', function ($name) {});
    $app->get('/customer/:CustomerID/XXX', function($customerId){});
});