今回Laravel6でlaravel-enumを導入してみたので、使い方までを簡単にまとめました。
なぜ、導入したくなったのかというと、config/const.php
に定数をずらずらと書いていくとプロジェクトが大きくなっていくにつれて見づらいのと、実際に定数から取得するときにconfig('const.enum.SPORT.BASEBALL')
のように全て手入力しないといけないのがつらいと思ったからです。
Laravel-enumの導入
laravelのバージョンが6の場合に対応しているバージョンの関係で導入するのに苦労しましたが、以下の記事で解決できました。
https://qiita.com/ntm718/items/c10ac1b67e185db36df0
composer require bensampo/laravel-enum: ^1.3
enumファイルの作成
最新のバージョンのREADMEを見ながら進めてしまうと、v1.3と所々異なる部分があるので、[README]
(https://github.com/BenSampo/laravel-enum/blob/272377a29c85f20d66b4bcd2605474e7474a0d51/README.md)のバージョンのREADMEを確認したほうが良いです。
php artisan make:enum SportType
上記コマンドを実行すると、app/EnumsディレクトリにSportType.php
が作成されます。
<?php
namespace App\Enums;
use BenSampo\Enum\Enum;
/**
* @method static static getDescription()
* @method static static getValue()
*/
final class SportType extends Enum
{
const BASEBALL= 0;
const FOOTBALL= 1;
const BASKETBALL = 2;
const GOLF = 3;
/**
* Get sport type description
*
* @param $value
* @return string
*/
public static function getDescription($value): string
{
if($value === self::BASEBALL){
return '野球';
}
if($value === self::FOOTBALL){
return 'サッカー';
}
if($value === self::BASKETBALL){
return 'バスケットボール';
}
if($value === self::GOLF){
return 'ゴルフ';
}
return parent::getDescription($value);
}
/**
* Get sport type value
*
*@param $key
*@return int
*/
public static function getValue(string $key)
{
if($key === '野球'){
return self::BASEBALL;
}
if($key === 'サッカー'){
return self::FOOTBALL;
}
if($key === 'バスケットボール'){
return self::BASKETBALL ;
}
if($key === 'ゴルフ'){
return self::GOLF;
}
return parent::getValue($key);
}
}
ビューで使用する場合
コントローラからスポーツ種別が2
で返ってきた場合
<p>{{ App\Enums\SportType::getDescription($item['sport_type']) }}</p> // バスケットボール
ラジオボタン
toSelectArray()
でvalue=>description
の形で取得することができます。
※最新のバージョンだとasSelectarray()
[0 => BASEBALL, 1 => FOOTBALL, 2 => BASKETBALL, 3 => GOLF]
@foreach(App\Enums\SportType::toSelectArray() as $key => $val)
<div class="form-check form-check-inline">
{{ Form::radio('sport_type', $key, ($key === $item['sport_type']), ['class' => 'form-check-input']) }}
{{ Form::label('sport_type'.$key, $val, ['class' => 'radio_class']) }}
</div>
@endforeach
セレクトボックスなども同様にApp\Enums\SportType::toSelectArray()
でリストを取得してforeachで回せば簡単に実装することができます。
コントローラで使用する場合
use App\Enums\SportType;
SportType::getDescription('0'); // 野球
SportType::getValue('野球'); // 0
バリデーション
$rules = [
'sport_type' => 'required|enum_value:' . SportType::class . ',false',
]
enum_value:' . SportType::class . ',false'
でvalueにない値がsport_typeに入って送られてきた場合に弾くことができます。
ちなみにfalseの意味ですが、Laravelでリクエストされたものは数値でも全てString型として送られてくるので、型チェックを回避するためにfalse
を指定してます。
By default, type checking is set to strict, but you can bypass this by passing false to the optional second parameter of the EnumValue class.
上記と同じ意味ですが、下記のような書き方でも同じ動作になります。
$rules = [
'sport_type' => ['required', new EnumValue(UserType::class, false)],
]
enum_value
と同様にenum_key
でもキーのバリデーションをかけることができます。
詳しくはREADMEを見るとわかりやすいと思います。
参考