我用slim3框架开始了一个项目。在我的项目中,我为管理员编写了一个名为admin
的路由组。
$app->group('/admin', function () use ($app) {
$app->add( new AdminMiddleWare() );
$app->get('/books/{id}', function ($request, $response, $args) {
...
});
});
任何管理员都应发送GET令牌进行验证。 我想创建一个用于检查管理员令牌的中间件,如果令牌未设置或无效,则显示403错误。
中间件类:
class AdminMiddleWare
{
/**
* Example middleware invokable class
*
* @param \Psr\Http\Message\ServerRequestInterface $request PSR7 request
* @param \Psr\Http\Message\ResponseInterface $response PSR7 response
* @param callable $next Next middleware
*
* @return \Psr\Http\Message\ResponseInterface
*/
public function __invoke($request, $response, $next)
{
???
}
}
你可以帮帮我吗?
答案 0 :(得分:1)
首先,您可以对添加中间件的方式进行一些改进。
$app->group('/admin', function () use ($app) {
$app->get('/books/{id}', function ($request, $response, $args) {
...
});
})->add( new AdminMiddleWare() );
将中间件附加到组而不是整个应用程序。
至于您的问题,您将在请求对象中提供查询参数。
例如,对于example.com/admin/books/12?token=sf342ad
这样的网址,您将拥有$params['token'] == 'sf342ad'
public function __invoke($request, $response, $next)
{
$params = $request->getQueryParams();
}
将令牌添加为路径的一部分可能更容易,因为您可以使用反向路由生成URL:
$app->group('/admin/{token}', function () use ($app) {
$app->get('/books/{id}', function ($request, $response, $args) {
...
})->setName('admin-book');
});
通过这样做,您在token
数组中会有$args
个密钥,它会匹配example.com/admin/sf342ad/books/1
等网址
你可以稍后在没有硬编码的情况下建立路线:
$app->getContainer()->get('router')->pathFor('admin-book', ['token' =>'your token', 'id' => 'book id'])