Perl日記

PerlとかRubyとかPHPとかPythonとか

Laravel5.1入門その5

ミドルウェアの使い方のもっと良い方法がちゃんと書いてあった。
HTTP Middleware - Laravel - The PHP Framework For Web Artisans


というかもうRailsぽい。

やりたいのは

ミドルウェア
app/Http/Middleware/ApiMiddleware.php

<?php

namespace App\Http\Middleware;

use Closure;

class ApiMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $now = time();

        $response = $next($request);

        $content = $response->getOriginalContent();
        $content['time'] = $now;
        $response->setContent($content);

        return $response;
    }
}

ミドルウェアを登録。

app/Http/Kernel.php

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [];

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'api' => \App\Http\Middleware\ApiMiddleware::class,
    ];
}

登録したミドルウェアを/api以下で動くようにルーティングを定義。
prefixとnamespaceを一緒に指定すると、区切ってる感でる。

app/Http/routes.php

<?php
Route::group(['prefix' => 'api', 'namespace' => 'Api', 'middleware' => 'api'], function()
{
    Route::get('', 'HomeController@index');
});

ベースのコントローラは一応作る。

app/Http/Controllers/Api/BaseController.php

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class BaseController extends Controller
{
}

本体のコントローラ。

app/Http/Controllers/Api/HomeController.php

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;

use App\Http\Requests;

class HomeController extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        return ['foo' => 'bar'];
    }
}

結果。

$ /usr/bin/curl -i http://localhost/api
HTTP/1.1 200 OK
Date: Fri, 19 Jun 2015 15:21:38 GMT
Server: Apache/2.4.12 (Ubuntu)
Cache-Control: no-cache
Content-Length: 31
Content-Type: application/json

{"foo":"bar","time":1434727299}

ちゃんとtimeがくっついた。