概要
Laravelではブラウザに保存されているcookieはEncryptCookies
というMiddlewareにより暗号化される。
その結果、cookieのバリューにnull
が設定されてしまい正しくcookieが取得できない。
dd($request->cookie());
// "test_cookie" => null
対処法
対処法は2つある。
1.PHPのグローバル変数である$_COOKIEを使う
$_COOKIE['test_cookie']
// "test_cookie" => 12345
PHPのグローバル変数である$_COOKIE
を使えば取得できるが、Laravelのシステムでは、Laravelのお作法に則った方がよいため、こちらは最終手段
にしたほうが良い。
2.EncryptCookiesの$exceptで暗号化の対象から除外したいcookieを設定する
EncryptCookies
では暗号化の対象から除外するcookieのキー
を設定できるため、これを使うのが正攻法だろう。
方法は下記の様に$exceptプロパティ
に暗号化の対象から除外したいcookieのキー
を設定するだけで良い。
class EncryptCookies extends Middleware
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array
*/
protected $except = [
'test_cookie'
];
cookieのキーを正規表現で設定したい
例えば、test_
から始まるcookieだけ暗号化の対象から除外したい場合はどうしたらよいだろうか?
方法としては、
1.EncryptCookies
のhandle
メソッドをオーバーロードする
2.暗号化前のcookieをすべて取得する
3.cookieのnull
を除去する
4.array_flip()
でキーとバリューを入れ替える
5.preg_grep()
でtest_
から始まるcookieを取得する
6.array_keys()
でキー
だけを取得し$this->except
に追加する
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return \Symfony\Component\HttpFoundation\Response
*/
public function handle($request, Closure $next)
{
$cookies = $request->cookie();
$cookies = array_filter($cookies, function($value) { return $value !== null; });
$cookies = array_flip($cookies);
$cookie = preg_grep('/^test_/',$cookies);
$this->except = array_keys(array_flip($cookie));
return $this->encrypt($next($this->decrypt($request)));
}
参考