Laravel 任意のステータスコードとビューをレスポンスとして返す

## 目的

- Laravelのアプリでビューファイルと一緒に任意のHTTPステータスコードを返す方法をまとめる
- ブラウザからHTTPステータスコードを確認する方法をまとめる

## 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2GHzクアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHPバージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravelバージョン | 7.0.8 | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

## 前提条件

- 実施環境に準ずる環境が整っていること。
- Laravelアプリが作成され、アプリの起動、ブラウザからの確認ができる状態になっていること。

## 前提情報

- ソースコードはこちら→[https://github.com/miriwo0104/laravel_crud/tree/response](https://github.com/miriwo0104/laravel_crud/tree/response)
- HTTPステータスコードは以後ステータスコードと若干省略して記載する。
- 筆者は下記記事で作成したアプリを用いて後述する作業を実施する。
    - [Laravel CRUD処理を使った投稿アプリを作成する その6 投稿編集機能](https://qiita.com/miriwo/items/fd5cfa7f1638227edb3f)
- 通常、Webページは正常に表示されているとステータスコード200が返される。
- 本記事の説明でよく出てくるステータスコードやレスポンスメッセージなどの仕組みに関しては下記の書籍が分かりやすい。
    - [Webを支える技術 -HTTP、URI、HTML、そしてREST ](https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042)
- 本記事では通常のだとステータスコード200が返されるページにて、コントローラファイルで設定を行いステータスコード500が返される様にしてみる。

## 読後感

- Laravelアプリでビューファイルと一緒に任意のステータスコードが返せる様になる。
- クライアントのブラウザに返されたステータスコードをchromeで確認する方法がわかる。

## 概要

1. ルーティング情報情報の記載
1. コントローラの作成と記載
1. ビューの作成と記載
1. ステータスコードの確認
1. 任意のステータスコードの記載
1. ステータスコードの再確認

## 詳細

1. ルーティング情報情報の記載
    1. アプリ名ディレクトリで下記コマンドを実行してルーティングファイルを開く。

        ```terminal
        $ vi routes/web.php 
        ```
    1. 下記の内容を追記して保存し、閉じる。

        ```アプリ名ディレクトリ/routes/web.php 
        Route::get('/status', 'StatusController@status')->name('status');
        ```
    1. ルーティングファイル全体の内容を下記に記載する。

        ```アプリ名ディレクトリ/routes/web.php
        <?php
        
        use Illuminate\Support\Facades\Route;
        
        /*
        |--------------------------------------------------------------------------
        | Web Routes
        |--------------------------------------------------------------------------
        |
        | Here is where you can register web routes for your application. These
        | routes are loaded by the RouteServiceProvider within a group which
        | contains the "web" middleware group. Now create something great!
        |
        */
        
        Route::get('/', function () {
            return view('welcome');
        });
        
        Auth::routes();
        
        Route::get('/home', 'HomeController@index')->name('home');
        
        Route::post('/status', 'StatusController@status')->name('status');
        ```
1. コントローラの作成と記載
    1. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを作成する。

        ```terminal
        $ php artisan make:controller StatusController
        ```
    1. アプリ名ディレクトリで下記コマンドを実行して作成したコントローラファイルを開く。

        ```terminal
        $ vi app/Http/Controllers/StatusController.php
        ```
    1. アクションとして下記の内容をクラス内に記載する。

        ```アプリ名ディレクトリ/app/Http/Controllers/StatusController.php
        public function status()
        {
            $str = ['message' => 'ステータスコードを500に設定していいます。'];
            return response()->view('statuses.return', $str, 500);
        }
        ```
    1. コントローラファイル全体の内容を下記に記載する。

        ```アプリ名ディレクトリ/app/Http/Controllers/StatusController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        
        class StatusController extends Controller
        {
            public function status()
            {
                $str = ['message' => 'ステータスコードを500に設定しています。'];
                return response()->view('statuses.return', $str, 500);
            }
        }
        ```
        
1. ビューの作成と記載
    1. アプリ名ディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

        ```terminal
        $ mkdir resources/views/statuses
        ```
    1. アプリ名ディレクトリで下記コマンドを実行してビューファイルを作成して開く。

        ```terminal
        $ vi resources/views/statuses/return.blade.php
        ```
    1. 下記の内容を記載する。

        ```アプリ名ディレクトリ/resources/views/statuses/return.blade.php
        <h1>{{$message}}</h1>
        ```
1. ステータスコードの確認
    1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ php artisan serve
        ```
    1. ブラウザで下記にアクセスする。（Authを用いたユーザ認証機能を有しているアプリで本作業を実施している場合、ログインしてユーザ認証を行わないと下記リンクにアクセスできない可能性がある。）
        - [http://127.0.0.1:8000/status](http://127.0.0.1:8000/status)
    1. 下記の様なページが開くことを確認する。

        ![127_0_0_1_8000_status.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/dbd71d93-f4fe-6afd-c250-9842b42650e4.png)

    1. 上記の画面が表示されているchromeのウインドウ上で右クリックをして、「検証」をクリックする。

        ![スクリーンショット_2020-08-21_22_45_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e7e501f2-2af5-c926-b36b-e95f07c80ba8.png)

    1. 開いた検証ページの「Network」をクリックする。

        ![127_0_0_1_8000_status-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8dfa8e38-6455-a409-2065-198451000413.png)

    1. 「Recording network activity...」の部分にコマンドキーとRキーを押下しろと書いてあるので押下する。

        ![127_0_0_1_8000_status-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/dbcdb45f-3398-cdc9-bd3c-f78133de198e.png)

    1. Nameが「status」のStatusがコントローラファイルで指定した500と表示されている。コントローラファイルのステータスコードを指定している部分を任意の物に変更し[http://127.0.0.1:8000/status](http://127.0.0.1:8000/status)を再読み込みすることでステータスコードが変化すると思われる。

        ![127_0_0_1_8000_status-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3e7d4f03-d6de-0e0a-b9cc-719ae44e2f85.png)

    1. Nameが「status」の物が表示されない場合、下記矢印部分の「All」が選択されているか確認する。

        ![127_0_0_1_8000_status-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3ea4985d-e1b8-11d6-c872-2b6ec504115b.png)

    1. 下記の様にコントローラファイルを修正したら指定した通りステータスコード505がブラウザでも確認できた。

        ```アプリ名ディレクトリ/app/Http/Controllers/StatusController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        
        class StatusController extends Controller
        {
            public function status()
            {
                $str = ['message' => 'ステータスコードを505に設定しています。'];
                return response()->view('statuses.return', $str, 505);
            }
        }
        ```

        ![127_0_0_1_8000_status-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/93e0ce98-964a-926f-1b1b-a395c92c09fd.png)