概要
Laravel5から使える機能にMiddlewareがあります。
Controllerの前処理、後処理を実装する時に使うやつです。
前処理をするMiddlewareで取得した値をviewに渡すのはView::shareを使って簡単にできたのですが、Controllerに渡すのに手こずったので、備忘録として記録しておきます。
やり方
まずMiddlewareクラスを作成します。
今回はDBから適当な値を取得して、Controllerに渡すようにしています。
Controllerに値を渡すためには、handleに渡ってくるrequestインスタンスに配列を追加しているところがすべてです。
requestインスタンスはController側で引き継がれるのでController側で値を取り出すことができます。
HogeMiddleware
<?php
namespace App\Http\Middleware;
use Closure;
class HogeMiddleware
{
public function handle($request, Closure $next)
{
// オブジェクトを取得
$hoge = Hoge::find(10);
$request->merge(['hoge' => $hoge]);
return $next($request);
}
}
作成したMiddlewareを使用できるように、Kernel.phpクラスに、作成したMiddlewareのrouteを追加
Kernel.php
protected $routeMiddleware = [
// この1行追加
'hoge' => 'App\Http\Middleware\HogeMiddleware'
];
最後にControllerで使われるように、コンストラクタでMiddlewareを呼び出します。
HogeController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class HogeController extends Controller
{
public function __construct()
{
// 作成したMiddlewareを呼び出し
$this->middleware('hoge');
}
// RequestインスタンスをInject
public function show(Request $request)
{
// Requestインスタンスから、Middlewareでセットした値を取得
$hoge = $request->hoge;
return response()->json($hoge);
}
若干分かりづらいかもしれませんが、
このようにして値をMiddlewareからControllerに受け渡すことができました。