我正在使用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处理函数中编写代码。
请提出建议。
答案 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;
});