【New Year Calendar】CakePHPでEnumを使用する3分クッキング


New Year Calendar 5日目
New Year Calendarって何ぞという方はまずこちらをご覧ください。

今日はCakePHPでEnumを使用する為の3分クッキングを行います。よろしくお願いします。
それでは早速始めましょう。
(基本、キュー◯ー3分クッキングのノリで進めます)

準備

必要な調理器具

  • CakePHP2系

先生「今日はEnumを作るのでCakePHP2系を使います。ただしCakePHP2系はガスコンロのみでIHには対応していないのでご注意下さい。IHに対応してるのは3系からですからね。」
アシスタント「動作は保証されないってことですね。分かります。」

材料

  • Composerライブラリ「myclabs/php-enum」:1つ
  • ソースコメント:目分量
  • やりきるパッション:小さじ1杯

調理手順

1. EnumのComposerライブラリをインストールする

PHPで列挙型を利用する為に独自実装も出来ますが、ここはphp-enumというComposerライブラリを使ってみましょう。

composer.jsonに以下を追加した後、composer installコマンドを実行してライブラリをインストールします。

composer.json
{
  "require": {
    ...,
    "myclabs/php-enum": "^1.5"
  }
}

2. Enumクラスを作る

今回は例としてCakePHPのModelディレクトリの下にEnumディレクトリを作り、ユーザー情報に関するEnumクラスUser.phpを作成します。

インストールしたphp-enumのライブラリを継承し、Enumクラスを作ります。

User.php
<?php
namespace Sample1\Model\Enum\User;

use MyCLabs\Enum\Enum;

/**
 * @method Status ACTIVE()
 * @method Status INACTIVE()
 */
class Status extends Enum
{
    const ACTIVE = 1;
    const INACTIVE = 2;
}

↑のクラスコメントはライブラリのREADMEに書いてある通りPhpStormでサポートする為の記法です。

3. Enumクラスをautoloadする

bootstrap.phpでspl_autoload_registerを使ってEnumクラスをautoloadする設定を追加します。

// Autoload model constants
spl_autoload_register(function ($class) {
    // Get file path by namespace
    // e.g. 「Sample1\Model\Enum\User\Status」→「~/app/Model/Enum/User.php」
    if (!preg_match("/Model\\\\Enum\\\\[A-Za-z]+/", $class, $match)) {
        return;
    }
    $filePath = APP . DS . str_replace('\\', DS, $match[0]) . '.php';
    if (file_exists($filePath)) {
        include $filePath;
    }
});

これにて調理完了!

実際に使ってみる

上記で作ったEnumをContollerで実際に参照してみます。

<?php
use Sample1\Model\Enum as Enum;

/**
 * Users Controller
 */
class UsersController extends Controller
{
    public function index() 
    {
        $userStatus = Enum\User\Status::ACTIVE;
        echo $userStatus; // 「1」が出力される
    }

これだけでCakePHPでEnumが使用できるようになりました。

明日は大晦日なのでGolangを使って年越しそばの作り方を紹介します(嘘です)