laravelで自作のミドルウェア作成する機会があったのでメモとして残していこうと思います。
■目次
・laravel MVC+(ルーティングとミドルウェア)について [図]
・ミドルウエア実装
■環境
・laravel5.8
・php7.2
laravel MVC+(ルーティングとミドルウェア)について [図]
図で書くとこんな感じです。
ミドルウェアは
ルーティングからコントローラ行くまでに実行されます。
(例)認証チェックなど
ミドルウェア実装
■前提(投稿アプリ作成)
現状として、
投稿4つあります。
id:4が自分が投稿したidとします。
しかし、localhost/post/1/editにアクセスするとid:1の投稿にアクセスでき変更更新ができてします。
今回はミドルウェアを使って解決していこうと思います。
1、ミドルウェア作成
php artisan make:middleware EditCheck
app\Http\Middlewareに作成されます。
2、ミドルウェア編集
EditCheck.php
<?php
namespace App\Http\Middleware;
use Closure;
use App\Post; //追加
class EditCheck
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$param = $request->route()->parameter('id');
//リクエストできたルートのパラメータidを取得
//今回は1が入ってくるとします
$post = Post::findOrFail($param);
//投稿したidを見つけます。今回は1の投稿を見つけます。
if (auth()->user()->id !== $post->user_id) {
//ログインしたユーザーidと投稿したユーザーidが一致しない場合
return redirect('/')->with('error', '許可されていない操作です');
//一番初めの画面に戻ります。
}
return $next($request);
//正常なら通常のページが表示されます
}
}
3、ミドルウェア登録
登録方法が3つあります
①全ての処理に共通して処理を行う場合→$middleware
②複数のミドルウェアをまとめて(グループ)登録する場合→$middlewareGroups
③単体で使うミドルウェアを登録しておく場合→$routeMiddleware
Kernel.php
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'editcheck' => \App\Http\Middleware\EditCheck::class,//追加
今回は③を採用します。
4、Routeでミドルウェア設定
web.php
Route::get('post/{id}/edit', 'PostsController@edit')->name('post.edit')->middleware('editcheck');
これでlocalhost/post/1/editにアクセスすると最初の画面に戻されると思います。
↧