まえがき
Laravelで定数を使う方法をメモ。
configを使う方法はよく見るのだけど、
定数クラスを使うパターンが見当たらなかったので。
前提
- PHP7.3.6
- Laravel 5.5.45
- サンプル
- Usersテーブルにgenderカラムがある
- genderカラムは以下の値を持つ
- 0: 回答なし
- 1: 男性
- 2: 女性
configを使う方法(よく見るヤツ)
基本はこちらのブログで書いてある通り。
(上記ブログでの転載元ShellingSoft開発者ブログが表示されなかった。。)
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でも使えるしね。
<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
<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
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
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
でも大丈夫。
ただ、名前がずれてるとちょっと見つけづらいので。
あとは使うだけ。
<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 内にサブディレクトリを置けることが分かったのはちょっとした収穫。