CakePHPからLaraveに移行して戸惑ったMiddleware
背景
前の仕事がCakePHPだったこともあり、個人でもCakePHPでよく作業をしていました。
CakePHPとLaravelの違いなんてめちゃくちゃあると思うんですけど、個人的にCakePHPで言うところの「beforefilter」の扱いが難しかったので、まとめようと思います。
beforefilter
そもそもbeforefilterとはなんぞやって話なんですけど、これはそのコントローラーのアクションを実行する前に共通してやる処理を書いたりする場所です。例えば、ログインしてなければリダイレクトとかは全部に書くのは面倒なので共通したい。などの時に使えます。
コードでいうと下記のようなイメージです。
function beforeFilter() {
/*ログインしてなかったらリダイレクト*/
.....
}
function add() {
/*商品追加*/
.....
}
function index() {
/*商品一覧*/
.....
}
middleware
laravelにも__cunstructというものがあるのですが、これはコントローラーが呼ばれた時に最初に実行されるだけで、beforefilterのような使い方はできないようです。middlewareは設定するだけで、そのアクションの前に呼ばれるというものです。
さっきと同じような挙動をしたい場合は下記のような感じになります。
/*Middleware/OnlyLoginUser.php*/
<?php
namespace App\Http\Middleware;
use Closure;
class OnlyLoginUser
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (/*ログインしてない*/) {
return redirect('/login');
}
return $next($request);
}
}
/*routes/web.php*/
<?php
//ログインしてないとできない機能
Route::group(['middleware' => ['OnlyLoginUser']], function () {
Route::get('/add', 'XxxxController@add');
Route::get('/index', 'XxxxController@index');
});
これで、ログインしてない人を/loginページに飛ばすとができます。
以上。