Laravel try catch finally文でDBとの接続を確認する

# 目的

- LaravelアプリとDBの接続を確認することのできるビューページの追加方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| 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 CRUD処理を使った投稿アプリを作成する その6 投稿編集機能](https://qiita.com/miriwo/items/fd5cfa7f1638227edb3f)

# 読後感

- 作成したDB確認ページにアクセスした際、正常にLaravelアプリとDBが接続できていると「DB OK」と表示し、HTTPレスポンスヘッダメッセージのステータスコード200を返す。
- DBと接続できていないと「ERROR DB connection NG」と表示し、HTTPレスポンスヘッダメッセージのステータスコード500を返す。

# 概要

1. ルーティング情報の追記
1. コントローラファイルの作成と記載
1. 確認

# 詳細

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

        ```terminal
        $ vi routes/web.php
        ```
    1. 下記の内容を追記する。

        ```アプリ名ディレクトリ/routes/web.php
        Route::get('/db_check/index', 'DbCheckController@index');
        ```
1. コントローラファイルの作成と記載
    1. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを作成する。

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

        ```terminal
        $ vi app/Http/Controllers/DbCheckController.php
        ```
    1. コントローラファイルに下記の内容を追記する。(Throwableは基底インターフェース名である。Exceptionも本インターフェースを実装している。参考文献にPHP公式ドキュメントへのリンクあり。)

        ```アプリ名ディレクトリ/app/Http/Controllers/DbCheckController.php
        // 下記を追記
        use Illuminate\Support\Facades\DB;


        public function index()
        {
            try {
                $db_infos = DB::select('select 1 as status');
                $message = 'DB OK';
                $status = 200;
            } catch (\Throwable $th) {
                $message = 'ERROR DB connection NG ';
                $status = 500;
            } finally {
                return response($message, $status);
            }
        }
        ```
    1. 追記後のコントローラファイルの全体の内容を下記に記載する。

        ```アプリ名ディレクトリ/app/Http/Controllers/DbCheckController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        // 下記を追記
        use Illuminate\Support\Facades\DB;
        
        class DbCheckController extends Controller
        {
            //
            public function index()
            {
                try {
                    $dbs = DB::select('select 1 as status');
                    $message = 'DB OK';
                    $status = 200;
                } catch (\Throwable $th) {
                    $message = 'ERROR DB connection NG';
                    $status = 500;
                } finally {
                    return response($message, $status);
                }
            }
        }
        ```
1. 確認
    1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ php artisan serve
        ```
    1. 下記にアクセスする。
        - [http://127.0.0.1:8000/db_check/index](http://127.0.0.1:8000/db_check/index)
    1. 下記の様に表示されることを確認する。

        ![127_0_0_1_8000_db_check_index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a2689ff7-e6ad-ff95-d7ea-9735f76b36b3.png)

    1. いったんローカルサーバを停止する。
    1. アプリ名ディレクトリで下記コマンドを実行して.envファイルを開く。

        ````terminal
        $ vi .env
        ```
    1. DB_PASSWORD=の記載を実際とは異なる内容にして保存する。
    1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ php artisan serve
        ```
    1. 下記にアクセスする。
        - [http://127.0.0.1:8000/db_check/index](http://127.0.0.1:8000/db_check/index)
    1. 下記の様に表示されていれば例外処理の記載完了である。

        ![127_0_0_1_8000_db_check_index-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/07c8366a-e148-5201-718c-5582df3af5fe.png)
        
# 参考文献

- [https://www.php.net/manual/ja/class.exception.php](https://www.php.net/manual/ja/class.exception.php)
- [https://www.php.net/manual/ja/class.throwable.php](https://www.php.net/manual/ja/class.throwable.php)
- [http://www.php-ref.com/basic/06_try_catch.html](http://www.php-ref.com/basic/06_try_catch.html)
- 独習PHP P380
- [PHP try catch finally文で例外処理を記載する]()
- [Laravel 任意のステータスコードとビューをレスポンスとして返す](https://qiita.com/miriwo/items/ce431ea8ce2abdd96d92)
- [例外(exceptions)](https://www.php.net/manual/ja/language.exceptions.php)