【Laravel】クッキーを読み書き

この記事は以下の書籍を参考に執筆しました

- [PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)



#クッキーを読み書き
Laravelでのクッキーの利用はリクエストとレスポンスクラスあるメソッドを使う。

###保管されているクッキーの値を取得
```php5
$変数=$request->cookie(キー);
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

###クッキーを新たに保存
```php5
$response->cookie(キー,値,分数)
//分数：保存期間を示す値
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


**クッキーの値の保存と取得はオブジェクトが違うことに注意**

###使ってみる
フォームからテキストを送信したものをクッキーとして保管してみる

コントローラクラスを修正

```php5
class HelloController extends Controller
{
   public function index(Request $request)
   {
       if ($request->hasCookie('msg'))
       {
           $msg = 'Cookie: ' . $request->cookie('msg');
       } else {
           $msg = '※クッキーはありません。';
       }
       return view('hello.index', ['msg'=> $msg]);
   }
    public function post(Request $request)
    {
        $validate_rule = [
            'msg' => 'required',
        ];
        $this->validate($request, $validate_rule);
        $msg = $request->msg;
        $response = response()->view('hello.index', 
            ['msg'=>'「' . $msg . 
            '」をクッキーに保存しました。']);
        $response->cookie('msg', $msg, 100);
        return $response;
    }
}
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


###クッキーの取得
```php5
if ($request->hasCookie('msg'))
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


msgというクッキーが保存されているかをチェック

|メソッド|説明|
|---|---|
|hasCookie|引数に指定したクッキーが保存されているか調べる|

```php5
$msg = 'Cookie: ' . $request->cookie('msg');
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


値の取得**は**あっさりと。

###クッキーの保存
ここから厄介

Responseのcookieメソッドで保存するが
**cookieメソッドで保存したresponseを返送しないとクッキーは保存されない**

```php5
$response = response()->view('hello.index', 
            ['msg'=>'「' . $msg . 
            '」をクッキーに保存しました。']);
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


responseメソッドはResponseを用意する。

この戻り値からviewメソッドを呼びレンダリング。

これで必要な設定がされたResponseが\$responseに格納される。

そしたら保存してreturn

```php5
        $response->cookie('msg', $msg, 100);
        return $response;
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)



これでクライアントにクッキーが送られる。
クッキーはクライアント側に保存されるからクッキーを設定したらレスポンスを返さなくちゃいけない。


#response()というメソッドについて
保存したクッキーをクライアントに返すのに、これでResponseインスタンスを用意していた。

だったら引数に`Response $response`を追加すればいいだろ、と思った。

しかしそうすると**\$response->view()**の呼び出しで「viewが見つからない」とエラーになる。
Responsenにはviewメソッドが用意されていない。
実はresponseメソッドで得られるのはResponseではない
###じゃあ何

「ResponseFactory」というResponseを生成するファクトリのインスタンス。

そしてそこにあるviewがResponseインスタンスを作っていた。

つまり

新たにResponseインスタンスを作って渡していた。
###new Responseでも可
responseメソッドを使う代わりに
new Responseでインスタンスを作って利用することも可能。

その場合は

```php5
new Response(view(...))
```

引数にviewメソッドの戻り地を指定して必要な設定が行える
Responseメソッドは色んな方法でインスタンスを用意できる。