拡張クラス(AdminController
extends AdminBaseController
)の__constructor
を使用しようとしていますが、どうやら機能していません。何ができるのかわかりません。私のクラスの両方:
AdminBaseController.php
class AdminBaseController extends Controller
{
public function __construct(){
if (!Auth::user()){
return view('admin.pages.login.index');
}
}
}
AdminController.php
class AdminController extends AdminBaseController
{
public function __construct(){
parent::__construct();
}
public function index()
{
return view('admin.pages.admin.index');
}
public function ajuda()
{
return view('admin.pages.admin.ajuda');
}
}
これは私のadmin
ルートグループです。
Route::group([
'prefix' => 'admin',
'middleware' => 'auth'
], function () {
Route::get('/', 'Admin\AdminController@index');
Route::get('login', 'Admin\AuthController@getLogin');
Route::post('login', 'Admin\AuthController@postLogin');
Route::get('logout', 'Admin\AuthController@getLogout');
Route::group(['prefix' => 'configuracoes'], function () {
Route::get('geral', 'Admin\AdminConfiguracoesController@geral');
Route::get('social', 'Admin\AdminConfiguracoesController@social');
Route::get('analytics', 'Admin\AdminConfiguracoesController@analytics');
});
Route::get('ajuda', 'Admin\AdminController@ajuda');
});
コントローラは、ユーザーが認証されているかどうかを確認するのに適切な場所ではありません。そのためにはミドルウェアを使用する必要があります。ミドルウェアが何であるかについての情報を取得するには here
この目的でデフォルトのLaravelのauth
ミドルウェアを使用する方法を見てみましょう。
まず、AdminBaseController
を取り除き、AdminController
のみを使用します
次に、ファイルapp\Http\Kernel.php
でauth
ミドルウェアが有効になっていることを確認する必要があります
次の行が必要です。
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
これは、ミドルウェアがアクティブであり、ルートで使用できることを意味します。
app\Http\Middleware\Authenticate.php
のミドルウェアクラス内に移動して、ミドルウェアの動作を指定しましょう。
//this method will be triggered before your controller constructor
public function handle($request, Closure $next)
{
//check here if the user is authenticated
if ( ! $this->auth->user() )
{
// here you should redirect to login
}
return $next($request);
}
あとは、ミドルウェアを適用するルートを決定するだけです。認証されたユーザーからのみアクセスできるようにする2つのルートがあるとします。この2つのルートにミドルウェアを使用するように指定する必要があります。
Route::group( ['middleware' => 'auth' ], function()
{
Route::get('admin/index', 'AdminController@index');
Route::get('admin/ajuda', 'AdminController@ajuda');
});
この目的でミドルウェアを使用し、コントローラーコンストラクターで以下の例のように使用します。
public function __construct()
{
$this->middleware('guest', ['except' => 'logout']);
}
そして、ユーザーからログインしてアクセスするルートを保護する必要があります。
Route::group(['middleware' => 'auth'], function() {
Route::get('/dashboard', 'DashboardController@index');
});
Laravel 5.5では、認証されていないユーザーがAuthenticateミドルウェアにAuthenticationException
例外をスローさせます。
protected function authenticate(array $guards)
{
if (empty($guards))
{
return $this->auth->authenticate();
}
foreach ($guards as $guard) {
if ($this->auth->guard($guard)->check()) {
return $this->auth->shouldUse($guard);
}
}
throw new AuthenticationException('Unauthenticated.', $guards);
}
これは、特定の例外をHTTP応答に変換するrender
メソッドを呼び出すapp/Exceptions/Handlerクラスによってキャッチされます。
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
App/Exceptions/Handlerは、「/ vendor/laravel/src/Illuminate/Foundation/Exceptions/Handler」内にある「Illuminate\Foundation\Exceptions\Handler」を拡張します。独自のレンダリングメソッドがあります。そのレンダリングメソッド内には、if else
という文。
elseif ($e instanceof AuthenticationException)
{
return $this->unauthenticated($request, $e);
}
以下は、同じクラス内で上記によって呼び出される「認証されていない」メソッドです
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson() ? response()->json(['message' => $exception->getMessage()], 401) : redirect()->guest(route('login'));
}
このメソッド内では、認証されていないユーザーをリダイレクトします。
私が見る限り、これは舞台裏で起こっていることです。
親コンストリクターを拡張して実行する方法は正しいですが、ビューを返して実行することは、ルート、コントローラーアクション、フィルターからのみ可能です。それ以外の場合は、send()を呼び出す必要があります。
あなたの目的のために、私はあなたがフィルタのために前に使用すべきだと思います http://laravel.com/docs/4.2/routing#route-filters