Slim Framework v3にアプリケーションがあります。コントローラにはclasses/FrontController.php
とclasses/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...
上記の方法を使用しても、おそらくすべてのルートに同様のものを追加する必要がありますか?したがって、各ルートメソッド内にロジックを追加するだけでは利点はありません。それは確かに非常にドライです! – Andy
@Andyあなたはグループ化されたルートを使うことができます。[Slim3のルータ](https://www.slimframework.com/docs/objects/router.html)でルートグループを検索すると、グループにミドルウェアを追加できますこれをすべてのルートに追加する必要はありません。また、グローバルなミドルウェアを追加して、 '/ admin'というURLを開始することもできます。または、独自の[エラーハンドラ](https://www.slimframework.com/docs/handlers/error.html)を追加し、アクセス拒否例外をスローしてそこにキャッチすることもできます。 – jmattheis