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

Slim Framework how to capture route parameter by Name in interceptor

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

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

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

请建议如何执行此操作。

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

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

我建议避免使用挂钩来确定正在调用 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 in $params
但是,如果您采用这种方法,我认为您应该定义所有路由回调以接受 $version 作为它们的第一个参数,这绝对是不必要和多余的,并且会使代码操作更加困难。但是如果你对路线进行分组,那么你会得到类似的东西:

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

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