0

我用 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)
    {
        ???
    }
}

你能帮助我吗?

4

1 回答 1

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您将拥有的 URL$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'])
于 2016-03-17T00:46:44.910 回答