如何在slim3中间件中添加错误处理程序

时间:2016-03-15 07:23:35

标签: slim middleware slim-3

我用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)
    {
        ???
    }
}
你可以帮帮我吗?

1 个答案:

答案 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'])