Help us understand the problem. What is going on with this article?

Laravelで定数をつかうよ

More than 1 year has passed since last update.

まえがき

Laravelで定数を使う方法をメモ。

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

前提

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

configを使う方法(よく見るヤツ)

Laravel5.5での定数の使い方

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

const.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でも使えるしね。

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
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
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を設定する。

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 でも大丈夫。
ただ、名前がずれてるとちょっと見つけづらいので。

あとは使うだけ。

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 内にサブディレクトリを置けることが分かったのはちょっとした収穫。

clustfe
最近はフリーランスでやらしてもらっています 仕事としてはPHPが99%・・・・のわりに技術は浅いです(´・ω・`) あと、PS2「ボクと魔王」が好きです
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away