はじめに

会員登録や購入手続きやフォームからの問い合わせ等、何かしらができるWebサイトがあって、複数の外部サイトからリンクされていたとして、どこからの成果なのか判別したい、という要望があります。

外部サイト側でいわゆる広告コードをリンクする際にパラメータとして渡して、それをWebサイト側で保持する、という方法が取られると思います。

その際、外部サイトからリンクされるのはWebサイトのトップページだけとは限らない場合、共通化したいな〜と思いますよね。

LaravelではHTTPミドルウェアという機能を使えばスッキリまとめることができます。

ミドルウェアの定義

artisanコマンドを使ってファイルを生成できます。ファイルはapp/Http/Middleware に生成されます。

$ php artisan make:middleware PrCode

ファイルの中は以下になります。

<?php

namespace App\Http\Middleware;

use Closure;

class PrCode
{
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle($request, Closure $next)
    {
        $pr_code = 'pr_code';
        if ( ! $request->input($pr_code)) {
            return $next($request);
        }

        $response = $next($request);
        $response->withCookie(cookie($pr_code, $request->input($pr_code), 0));

        return $response;
    }
}

リクエストパラメータにpr_code がないか、あってもfalse とみなされる値の場合は何もせず、それ以外の場合はCookieに値をセットしてリクエストのあった画面に遷移します。

また、今回のミドルウェアをルーティングで使用するためにapp/Http/Kernel.php の$routeMiddleware に追加します。

protected $routeMiddleware = [
    // 省略
    'pr_code' => \App\Http\Middleware\PrCode::class,
];

Cookieの取り出し・削除

成果が発生してCookieの値を取り出したい時は、該当するコントローラーにて

$request->cookie('pr_code');

Cookieの値を削除したい時は

return view('path.to.view')->withCookie(cookie()->forget('pr_code'));

pr_code ってベタに書いてるけど実際にはconfig化してConfig::get() するなどした方がいいと思います。

ルーティング

ミドルウェアの適用範囲をapp/Http/routes.php で設定します。

Route::group(['middleware' => 'pr_code'], function () {
    // ここに書いたルーティングが対象となります
});