2016-03-15 80 views
0

我使用slim3框架開始了一個項目。在我的項目中,我爲管理員編寫了一個名爲admin的路由組。如何在slim3中間件中添加錯誤處理程序

$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

首先,您可以對添加中間件的方式做一些小的改進。

$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(); 
} 

這可能是更容易的令牌添加爲路線的一部分,你可以使用反向路由產生的網址:

$app->group('/admin/{token}', function() use ($app) { 
    $app->get('/books/{id}', function ($request, $response, $args) { 
     ... 
    })->setName('admin-book'); 
}); 

這樣做它是這樣的,你將在$args陣列中有一個token密鑰,並且它將匹配如下的URL:example.com/admin/sf342ad/books/1

然後你可以在沒有哈希的情況下建立路由rdcoding much:

$app->getContainer()->get('router')->pathFor('admin-book', ['token' =>'your token', 'id' => 'book id']) 
相關問題