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ような URL と一致します。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 に答える