2017-01-09 4 views
-1

Slim Framework v3にアプリケーションがあります。コントローラにはclasses/FrontController.phpclasses/AdminController.phpの2つがあります。Slim Frameworkコントローラ内でリダイレクトを実行できません__construct()

AdminController.phpは管理機能用です(驚くことではありません)!FrontController.phpはアプリケーションの「公開」部分です。

/index.phpにはさまざまなルートが定義されていますが、これらのコントローラではすべて正常に機能します。

AdminController::__construct()の中に1つのコードを書き込んで(これをすべて繰り返さずに)、URL操作によって任意のAdminルートにアクセスしようとすると、ユーザをFrontController::index()にリダイレクトします。

私は私のAdminControllerを持っているコードは、このようなものです:

public function __construct(Slim\Container $ci) { 
    $this->ci = $ci; 
    if (!$this->_isAdmin()) { 
     return $this->ci->response->withStatus(302)->withHeader('Location', '/index'); 
    } 
} 

これは、たとえ$this->_isAdmin() falseを返し何もしていないようだ - 私も偽かかわらずを返すのみことによってそれをテストしてみましたデータベースは通常の操作で復帰します。私の期待はこの時点でリダイレクトされることですが、ブラウザで/adminにアクセスすると、代わりにAdminController::index()がロードされます。

これは、応答がコンストラクタで操作できないという事実と関係していると思いますか?しかし、私は今失われており、これをどう対処するか分かりません。何かアドバイスをいただきました。詳細について

index.php内のルートは、このようなものです:

$app->get('/', '\FrontController:index')->setName('/index'); 
$app->get('/admin', '\AdminController:index'); 
// many other routes... 

答えて

2

あなたは、コンストラクタ内Responseオブジェクトを返すようにしようとしています。コンストラクタはオブジェクトを構築するためのもので、戻り値は何もしません。ミドルウェアを使用するか、すべてのルートメソッドでこのチェックを行う必要があります。

$app->get('/admin', '\AdminController:index')->add(function($request, $response, $next) { 
    if(user is not admin) { 
     return $response->withStatus(302)->withHeader('Location', '/index'); 
    } 
    return $next($request, $response); 
}); 
+0

上記の方法を使用しても、おそらくすべてのルートに同様のものを追加する必要がありますか?したがって、各ルートメソッド内にロジックを追加するだけでは利点はありません。それは確かに非常にドライです! – Andy

+1

@Andyあなたはグループ化されたルートを使うことができます。[Slim3のルータ](https://www.slimframework.com/docs/objects/router.html)でルートグループを検索すると、グループにミドルウェアを追加できますこれをすべてのルートに追加する必要はありません。また、グローバルなミドルウェアを追加して、 '/ admin'というURLを開始することもできます。または、独自の[エラーハンドラ](https://www.slimframework.com/docs/handlers/error.html)を追加し、アクセス拒否例外をスローしてそこにキャッチすることもできます。 – jmattheis

関連する問題