Laravelで定数をつかうよ

# まえがき
Laravelで定数を使う方法をメモ。

configを使う方法はよく見るのだけど、
定数クラスを使うパターンが見当たらなかったので。


# 前提
- PHP7.3.6
    - Laravel 5.5.45
- サンプル
    - Usersテーブルにgenderカラムがある
    - genderカラムは以下の値を持つ
        - 0: 回答なし
        - 1: 男性
        - 2: 女性


# configを使う方法（よく見るヤツ）

[Laravel5.5での定数の使い方](https://hiroslog.com/post/32)

基本はこちらのブログで書いてある通り。
（上記ブログでの転載元ShellingSoft開発者ブログが表示されなかった。。）


## const.phpで一元管理するパターン

```php:config/const.php
<?php

return [
    // usersで使う定数
    'Users' => [
        'GENDER_NONE' => 0,
        'GENDER_MAN' => 1,
        'GENDER_WOMAN' => 2,
        'GENDER_LIST' => [
            'gender_none' => 0,
            'gender_man' => 1,
            'gender_woman' => 2,
        ],
    ],
];
```

テーブル名を第1キー（第2キーか？）にして、カラム＋意味で定数名をつくる。
`GENDER_LIST`は入力欄を楽に作りたいから用意した。
Validationでも使えるしね。


```php:resources\views\users\user.blade.php
  <table>
    <tr>
      <th>性別</th>
      <td>
        <ul>
          @foreach (config('const.Users.GENDER_LIST') as $key => $value)
            <li>{!! Form::radio('gender', $value) !!}{{ __("values.gender_{$key}") }}</li>
          @endforeach
        </ul>
      </td>
    </tr>
  </table>
```

## テーブルごとにファイル分けるパターン

const.phpだけでつくると1ファイルが大きくなって見づらくなるので、ちょっと定数が多いなと思ったら、テーブル単位でファイルを分けてみた。
その際、今度はconfigディレクトリがいっぱいになってゲンナリするので、定数用のサブディレクトリを用意した方がよさげかな？

```
config
  └ consts
    └ users.php
```

```php:resources\views\users\user.blade.php
  <table>
    <tr>
      <th>性別</th>
      <td>
        <ul>
          @foreach (config('consts.users.GENDER_LIST') as $key => $value)
            <li>{!! Form::radio('gender', $value) !!}{{ __("values.gender_{$key}") }}</li>
          @endforeach
        </ul>
      </td>
    </tr>
  </table>
```


# 定数クラスを使う方法（見当たらなかったヤツ）

やっぱ定数は `\User::GENDER_LIST` みたいに呼び出したい････
とはいえ、モデル内のクラス定数だと `\App\User::GENDER_LIST` と頭に `\App` がつくのが煩わしい。。
そこで、定数だけを切り離した定数クラスを用意してみた。

まずは適当なところに定数ファイルをつくる。

```
app
  └ Consts
    └ UserConst.php
```

```php:app/Consts/UserConst.php
<?php

namespace App\Consts;

// usersで使う定数
class UserConst
{
    const GENDER_NONE = 0;
    const GENDER_MAN = 1;
    const GENDER_WOMAN = 2;
    const GENDER_LIST = [
        'none' => self::GENDER_NONE,
        'man' => self::GENDER_MAN,
        'woman' => self::GENDER_WOMAN,
    ];
}
```

次に、aliasを設定する。

```php:config/app.php
<?php

return [
    //
    // 省略
    //  
    'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        //
        // 省略
        //  
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,


        // 定数系
        'UserConst' =>  App\Consts\UserConst::class,
];
```

ちなみに、クラス名が `(テーブル名)Const` としたのは、
テーブル名のままaliasを設定するとなんかにぶつかるかもとヒヨったからです。。
aliasで設定する名前だけ `UsersConst` としておけば、クラス自体の名前は `User` でも大丈夫。
ただ、名前がずれてるとちょっと見つけづらいので。

あとは使うだけ。

```php:resources\views\users\user.blade.php
  <table>
    <tr>
      <th>性別</th>
      <td>
        <ul>
          @foreach (\UserConst::GENDER_LIST as $key => $value)
            <li>{!! Form::radio('gender', $value) !!}{{ __("values.gender_{$key}") }}</li>
          @endforeach
        </ul>
      </td>
    </tr>
  </table>
```

最初はFacadeを使って読み込もうとしていたんだけどどうもうまくいかず、
試しに直接 alias で設定したらうまくいきました。



# あとがき
そもそもテンプレート上で定数を使いたかったから色々探したんだけど、
軒並み `config/const.php` を使う方法しか見つからず、
「方法がこれだけってんなわけねぇだろ････(´・ω・｀)」と思って調べました。

おかげで config 内にサブディレクトリを置けることが分かったのはちょっとした収穫。