Laravelで定数を使う場合のパターン

# 概要
Laravelを使っている案件をいくつか経験し、定数の使い方を色々列挙していく

## ①config配下を使う
configディレクトリ以下に定数用のファイルを作成して、configメソッドで呼び出す
envファイルと組み合わせて環境に応じて変わるような値を設定するのによく使われている印象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/7bf86f6e-edd6-6f27-c412-15d6de958651.png)

### 例
問い合わせフォーム経由で連絡があった場合に管理者へ送信する時の管理者のメールアドレスを定義しておく
ローカルや本番などで指定するアドレスが違うことが多いので、よくあるパターンだと思う

例えば、config配下にemailaddress.phpような名前でファイルを作る
```config/emailaddress.php
<?php

return [
    'mail_admin'   => env('MAIL_ADMIN', 'admin@example.com'),
];
```

.envファイルにも定義しておく
```.env
MAIL_ADMIN=hoge@gmail.com
```

呼び出す場合はconfigメソッドを使う
```TestController.php
public function index ()
{
   $address = config('emailaddress.mail_admin');
   var_dump( $address );
}

# .envに定義されている場合は、.envで設定された値が出力される
# =>  hoge@gmail.com

# .envに定義されていない場合はデフォルト値が出力される
# =>  admin@example.com
```

## ②Modelファイルを使う
Model内にconstなどで定義しておく
システム全体というより、そのModelに関係する内容だけ記載されている印象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/439159ba-4b72-8ceb-0cb2-cf0ef4934145.png)
### 例
ECサイトなどで会員ステータスがある場合にデータベースに保存されるステータスの値を定義する場合など

```User.php
class User
{
    const STATUS = [
        0 => '仮会員',
        1 => '本会員',
        2 => 'VIP会員',
    ];
}
```

呼び出す場合は、ダブルコロン::(スコープ定義演算子)で呼び出す
```TestController.php
use App\Models\User;

class TestController extends Controller
{
  public function index ()
  {
     $now_status = User::STATUS[0];
     var_dump( $now_status );
  }
}

# => 仮会員  
```

## ③定数用のディレクトリを作る
app配下などにConstsなど定数用に好きなディレクトリ名を作って定数ファイルを置く。
システム全体で使う場合の定数を管理する際に使われる印象。結構よくみるやり方。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/f119a6f4-7699-6afe-5221-9808f1f81c4c.png)

### 例
都道府県など定数としてセットしておく。
config配下で作成してもよいが、以下のような書き方をして、ダブルコロン::(スコープ定義演算子)で呼び出せるようにするとVSコードなどIDEで補完してくれたり、viewで値に対して名称を表示させる時などに使いやすい。

```app/Consts/PrefectureConst.php
<?php
namespace App\Consts;

class PrefectureConst
{
    const LIST = [
        '1' =>['name' => '北海道', 'en' => 'hokkaido'],
        '2' =>['name' => '青森', 'en' => 'aomori'],
        // 中略 //
　　　　　　　　　　　　　　　　'47'=>['name' => '沖縄県', 'en' => 'okinawa']
    ]
}
```

呼び出す場合は、ダブルコロン::(スコープ定義演算子)で呼び出す
```TestController.php
use App\Consts\PrefectureConst;

class TestController extends Controller
{
  public function index ()
  {
     $pref_name = PrefectureConst::LIST[2]['name'];
     var_dump( $pref_name );
  }
}

// => 青森  
```

## ④言語ファイルを使う
Laravelでは多言語対応するようにlangディレクトリ配下のファイルを使って、利用する言語によってシステム内で文字を変換してくれる機能がある。
定数として使うのは少し意味が異なるが、システム内の言葉の定義をここで利用している案件もあった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/d2ba560e-7f4c-f7d5-a418-919dd22a83d1.png)
### 例
・何かしらアラートを出す場合の文言を統一する
・ページの呼称を統一する（TOPなのかトップなのか）

例えば、デフォルトだとlang配下にlabel.phpのような名前のファイルを作成する
```lang/ja/label.php
<?php

return [
    'alert' => [
        'delete'   => '削除すると元に戻せません。実行する場合は、はいをクリックしてください',
        'submit'   => '送信します。実行する場合は、はいをクリックしてください',
    ],

    'page' => [
        'top'      => 'TOPページ',
        'index'    => '一覧ページ',
        'detail'   => '詳細ページ',
    ],
];
```

呼び出す場合は、transメソッドを使う
```welcome.blade.php

<p>{{ trans('label.alert.delete') }}</p>

// => 削除すると元に戻せません。実行する場合は、はいをクリックしてください  
```

※表示されない場合はconfigのapp.phpの設定が以下になっているか確認してください。
```config/app.php
// タイムゾーンを Asia/Tokyo に変更
'timezone' => 'Asia/Tokyo',

// ロケールを ja に変更
'locale' => 'ja',
```



以上となります。
参考になれば幸いです。