Laravelで定数を使うときにConfigを使う腰抜けはもう死んだ

3 min read読了の目安(約3200字 4

はじめに

どうも、チキンと呼ばれたらキレる系プログラマーのあおいくんだよ。
みんなはLaravelで定数使うときどうしてる?
僕は数ヶ月前までconfig配下にconst.phpとか作ってそこにバカスカ定義する腰抜けだったんだよね。
でも、そんな腰抜けは背後からナイフで一発、もう死んじまったって噂だよ。
今回はみんながそうならないためにLaravelで定数を定義するときのよりよい方法を紹介するよ。

環境

PHP:7.4系
Laravel:7.x系

config.phpに定義してた腰抜け時代

まるでそれがベストプラクティスかのように世の中に流布されている定数の定義方法として「config/const.phpにバカスカ定義する」ってやつがあるじゃん。
僕もアレに騙されてた腰抜けの一人だったわけ。

config/const.php
<?php

return [

  ~~~他の記述~~~

  // キラメイジャーのメンバー
  'Kirameiger' => [
    'KIRAMEI_RED' => 1,
    'KIRAMEI_YELLOW' => 2,
    'KIRAMEI_GREEN' => 3,
    'KIRAMEI_BLUE' => 4,
    'KIRAMEI_PINK' => 5,
    'KIRAMEI_SILVER' => 6,
    'MEMBER_LIST' => [
      'キラメイレッド' => 1,
      'キラメイイエロー' => 2,
      'キラメイグリーン' => 3,
      'キラメイブルー' => 4,
      'キラメイピンク' => 5,
      'キラメイシルバー' => 6,
    ],
  ],
  
  ~~~他の記述~~~
  
];

これってとりあえず定義はできるけど、冷静に見たらこれはないんじゃないかなってのがなんとなく伝わってくると思うの。
僕が思うにイケてないポイントは少なくとも2つあると思うんだよね。

  1. ファイルがめっちゃ長くなる
    今はキラメイジャーだけだけど、例えば45戦隊シリーズ全部定義しようって思ったら、このファイルの中に45戦隊分全部定義することになって、そうすると900行くらいのファイルになっちゃうよね。
    めちゃめちゃに長いファイルはめちゃめちゃ見通しが悪くなるし、正直全然イケてないよね🤷‍♂️

  2. 変更に弱い
    これ、例えばやっぱ番号0からふるようにしましょうってなったとするよ。
    そしたらそれぞれを定義しているところとメンバーの配列を定義してるとこの2箇所をいじらなきゃいけなくなるよね。
    そうなるとうっかり変更を忘れちゃってメンバーの配列のキラメイレッドは1番始まりのままになってるとかいうことが起こりかねないよね🤷‍♂️

ちなみに表で呼び出すときは

kirameiger.blade.php
@foreach (config('const.Kirameiger.MEMBER_LIST') as $name => $number)
  <p>{{ $name }} => {{ $number }}</p>
@endforeach

みたいな呼び出しになるよ。まぁまぁの見た目だね。

Configの中で用途ごとに個々に分けてた腰抜け時代

バカデカファイルにうんざりした腰抜けは、「用途ごとにファイル分けたらいいんぢゃね?マジで天才ぢゃん😁」って思ったのよ。
つまりconfig/consts/kirameiger.phpにしてみたわけ。新しい戦隊が放送開始したらconfig/consts/zenkaiger.phpとかも作るわけよ。
これ前述の①は解決できると思うんだけど、結局②が残るよね。
そうなるとこれも結局あんまいい方法じゃないって腰抜けが気づくまでに数ヶ月かかったんだよね🤷‍♂️

そして辿り着いた定数クラスを作る時代

そんじゃあ、これどうすればいいんだよって話。
答えは簡単、app配下にConstsフォルダを作るんだよね。
その中で定数として定義して呼び出して上げればよかったんだよね。

app/Consts/KirameigerConsts.php
<?php

namespace App\Consts;

// usersで使う定数
class KirameigerConsts
{
  // キラメイジャーのメンバー
  public const KIRAMEI_RED = 1;
  public const KIRAMEI_YELLOW = 2;
  public const KIRAMEI_GREEN = 3;
  public const KIRAMEI_BLUE = 4;
  public const KIRAMEI_PINK = 5;
  public const KIRAMEI_SILVER = 6;
  public const MEMBER_LIST = [
    'キラメイレッド' => self::KIRAMEI_RED,
    'キラメイイエロー' => self::KIRAMEI_YELLOW,
    'キラメイグリーン' => self::KIRAMEI_GREEN,
    'キラメイブルー' => self::KIRAMEI_BLUE,
    'キラメイピンク' => self::KIRAMEI_PINK,
    'キラメイシルバー' => self::KIRAMEI_SILVER,
  ];
}

よくない?見た目もよくない?イケてない?そうでもない?
これならファットなファイルを作らずに済むし、自分の中で定義した定数を使えるからこちゃこちゃした配列とかを定義しても変更漏れとかの問題なくない?

ちなみに表で呼び出すときは

kirameiger.blade.php
@foreach (App\Consts\KirameigerConsts::MEMBER_LIST as $name => $number)
  <p>{{ $name }} => {{ $number }}</p>
@endforeach

みたいな呼び出しになるよ。まぁまぁいいんじゃないかな。
でも、呼び出しちょっと長くない?って思うよね。僕も思う。
そういう人はapp.phpにaliasを設定してあげれば

config/app.php
<?php

return [

  ~~~いろんな記述~~~

  'aliases' => [

    ~~~いろんな記述~~~

    'KirameigerConsts' =>  App\Consts\KirameigerConsts::class,
  ],
];

とか記述してあげれば

kirameiger.blade.php
@foreach (KirameigerConsts::MEMBER_LIST as $name => $number)
  <p>{{ $name }} => {{ $number }}</p>
@endforeach

みたいな呼び出せるようになるよ。スマートになるね。

おわりに

いまのところこれが一番しっくりきてるやり方だよ。
正直aliasを登録するのもなんかちまちましててめんどくさすぎるから、実は一気に解決できる方法があるんじゃないかとは疑ってるよ。
もし知ってる人いたら出し渋らずに教えてくれよな👋