BackEnd

laravel-enumを使ってみたら快適だった

投稿日:2019年5月30日 更新日:

はじめに

こんにちは。Laravelでenumを使いたい時、PHPやLaravel本体ではサポートされていないのでComposer経由でパッケージを入れることになります。
今は bensampo/laravel-enum を使っており、とりあえず不自由ない感じなので、紹介しようと思います。

enumについて

列挙型 – Wikipedia

railsで初めてenumを知ったのですが、C言語の時点で既にあったのですね。
私は「限られた値しか持てないデータ型」と認識してます。

例えば注文情報テーブルに支払方法を保存する時、データベースの orders テーブルに payment_type カラムを持たせるとします。
card, transfer, cash など支払方法名だけが orders.payment_type に入るようにしつつ、表示時は「クレジットカード」や「銀行振込」といった文字列で扱いたい…なんてケースはよくあると思いますが、こういう場合に便利です。

環境

  • PHP 7.3.3
  • Laravel 5.8
  • laravel-enum 1.9

導入

composerコマンドでさくっとインストール完了です。

enumクラス

生成

マイグレーションはenumクラスの後に作った方が(多分)効率が良いので、まずはenumクラスを生成します。

なおデフォルトでは app/Enums ディレクトリが生成され、その中にPHPファイルが自動生成されます。ディレクトリを切り分けたい場合、例えば app/Enums/Order に作りたいのであれば Order/PaymentType となります。
このパラメータ、 app/Enums を起点とした相対パスとして扱われるので、例えば $ php artisan make:enum ../Models/Enums/TestEnum と記述すれば、 app/Models/EnumsTestEnum.php が生成されます。
ディレクトリ構造はプロジェクトによって様々だと思いますので、お好みで。

enumクラス編集

日本語化

続いて公式の方法に従って resources/lang/ja/enums.php を作成し、以下のように記述します。フレームワークのlocale設定に従った enums.php を読みに行きますので、 config/app.phplocale を日本(ja)に設定しておきましょう。

マイグレーション

生成

orders テーブルに payment_type というenum型のカラムを追加します。

編集

$table->enum()Laravel 5.8から使用できます。直接指定できるのはいいですね。
また「マイグレーションはクラス作成の後で」と前述したのは、enum型カラムの定義にenumクラスの値を適用できるためです。もちろん配列をべた書きしてもいいのですが、この方がすっきり分かりやすいかなと。

プロパティのキャスト

Eloquent ではモデルクラスのプロパティに定義することで、インスタンス生成時に別の型に自動キャストしてくれる機能があります。 protected $dates = []; に入れておけば自動で Carbon にキャストしてくれるとか、そういうやつです。
laravel-enum でも 同様の機能があり、以下のコードで自動キャストが可能です。

こうしておくことで何が嬉しいのかと言うと、以下のようにbladeでの記述が減ります。

当初は自動キャストせず前者のように書いてたのですが

  • 「いちいちstaticメソッド呼ぶのかったるいよね?」
  • 「ていうかbladeでこの書き方はイマイチなのでは?」
  • 「何かもっとスマートな書き方ないの?あるよね?」

と思い至り、調べた結果見つけた方法でした。
地味ですが少しでもコード量は減らしたいので!

さいごに

enum、いいですね。昔はこういった実装をする際、DBにマスターテーブル作ってconst.phpとか作って定数を列挙して…みたいなことをしてましたが、大抵const.phpが肥大化して管理が億劫になってました。定義がコード化されて気分がいいです。

おすすめ書籍

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 PHPフレームワーク Laravel入門

blog-page_footer_336




blog-page_footer_336




-BackEnd
-, ,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

WebアプリケーションにLINEログインを組み込む

1 はじめに2 LINEログインとは2.1 LINEログインでできること2.2 LINEログインのフロー3 LINEログインの設定3.1 プロバイダーを新規作成する3.2 チャネルを作成する3.3 リ ...

Pythonで書かれたスクレイピングのコードをRubyで書いてみる

1 はじめに2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 さいごに はじめに 以前、技術評論社さん ...

laravel logo

Laravelのバッチ処理を作る

1 はじめに2 環境3 artisanコマンド作成4 artisanコマンドをバッチとして登録する5 さいごに6 おすすめ書籍 はじめに こんにちは。webアプリにつきもののバッチ処理ですが、もちろん ...

Stripe Connectを使ってCheckoutを利用した継続課金を実装

1 はじめに1.1 Checkoutを使う場合の動線2 決済画面への遷移2.1 マイグレーション2.2 Checkout Sessionの作成3 決済完了後の制御4 おまけ4.1 ローカルでWebho ...

rails

Ruby、Railsの時間に関するメソッドを使用してみた

はじめに 普段PHPのお仕事をしています、tonnyです。 半年程前からRuby on Railsの勉強を始めました。 今回はよく使う時間に関するメソッドついてまとめたいと思います。 目次 1 はじめ ...

フォロー

blog-page_side_responsive

2019年5月
 1234
567891011
12131415161718
19202122232425
262728293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。