Posted at

[Laravel5] Middlewareで取得した値をControllerで使う方法

More than 3 years have passed since last update.


概要

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に受け渡すことができました。


参考

http://stackoverflow.com/questions/30212390/laravel-middleware-return-variable-to-controller