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){});
});
哪个更干净,不需要额外的努力。
我使用的是 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){});
});
哪个更干净,不需要额外的努力。