
viewにログインユーザ名を渡す等、共通の処理をMiddlewareを使って制御する方法。
環境
- Laravel 5.2
やること
- Middlewareを作成する
- 作成したMiddlewareをKernelに追加する
Middlewareを作成する
今回はすべてのviewで使っているデータを渡すミドルウェアを作ってみる。
1 |
$ php artisan make:middleware Views |
app/Http/MiddlewareにViews.phpが作成される。
デフォルトがこれ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Http\Middleware; use Closure; class Views { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request); } } |
handle()にいろいろ追記していく。
View::share()を使って、とりあえずログインユーザ名を渡してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App\Http\Middleware; use Closure; class Views { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { //ユーザ名をviewに渡す \View::share('username', \Auth::user()->name); return $next($request); } } |
ミドルウェアはこれでOK.
MiddlewareをKernelに追加する
ミドルウェアを作っただけでは呼べないので Kernel.php の $routeMiddleware に追記して呼び出せるようにする。
app/Http/Kernel.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** * アプリケーションのルートミドルウェアスタック * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, /** * カスタム */ //共通のview変数 'views' => \App\Http\Middleware\Views::class, // <- new ]; |
コントローラからミドルウェアを呼び出す
ベースコントローラにて middleware(‘views’) を追加する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Http\Controllers; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Routing\Controller as BaseController; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; public function __construct() { $this->middleware('auth'); $this->middleware('views'); //<- new } } |
これでviewの中で {{$username}} が使える。
ただ、
この例だとユーザ名しか渡してないし、viewで {{\Auth::user()->name}} とすれば解決するのであんまり恩恵がない…
動的に変更する必要がある共通項目とかなら真価を発揮できる。
パッと思いつくのはAPIコントローラでAjax通信でなければ拒否するとか…
うまいこと使って行こう。