思わず使いたくなる! 私だけが知ってるFuelPHPの便利な関数を紹介します


こんにちは。
開発チームのワイルド担当、まんだいです。

開発をしていると、ついついドキュメントを見ずに自作の便利関数をまとめたUtilityクラス的なものを作りがちですが、フレームワークには、ある程度便利な関数が揃っているものです。
ドキュメントが英語だとか、機能が多すぎて網羅できていないとか、色々ありますので、これは、と思ったFuelPHPの便利なクラス、関数をまとめてみたいと思います。

Arr::pluck()

最初から飛ばしていきますが、これは非常に便利です。
英単語が身近ではなさすぎて(これは私のボキャブラリーに対して、です)パッと見、なんの事か分からなかったんですが、array_keys関数の拡張版といえばピンとくるでしょうか。

array_keysはその名の通り、配列のキーを取り出し、キーを値にした新たな配列を戻す関数ですが、Arr::pluck()は、オブジェクトのプロパティに対しても、動作する、対モデルなんかに重宝するんじゃないかと思われる便利なやつです。

class Item
{
    public $name;
    public $value;
    public $color_id;

    public function __construct($name, $value, $color_id)
    {
        $this->name = $name;
        $this->value = $value;
        $this->color_id = $color_id;
    }
}

$items = [];
$items[] = new Item('匂いつき消しゴム(赤)', 150, 1);
$items[] = new Item('匂いつき消しゴム(青)', 150, 2);
$items[] = new Item('匂いつき消しゴム(黄)', 150, 3);

$color_ids = Arr::pluck($items, 'color_id');

var_export($color_ids);

// 結果は
// array (
//   0 => 1,
//   1 => 2,
//   2 => 3,
// )

 
なかなか分かりにくい例かも知れませんが、一度使えば、なるほどですねとなるはずです。
内部で型チェックして処理が分かれているので、純粋な配列に対しても問題なく使えますが、配列の場合でもarray_keysに流しているわけではないので、配列だとわかっている場合は、素直にarray_keysを使ったほうが速いでしょう。

 

Eventクラス

FuelPHPには、各処理が始まる前や終わったタイミングで、処理を差し込むことができます。
具体的には、configディレクトリ以下にevent.phpを作成しますが、他のコンフィグ同様、配列で指定します。

return [
    'fuelphp' => [
        'app_created' => function(){},
        'request_created' => function(){},
        'request_started' => function(){},
        'controller_started' => function(){},
        'controller_finished' => function(){},
        'response_created' => function(){},
        'request_finished' => function(){},
        'shutdown' => function(){},
    ],
];

 
配列の中に無名関数で処理を追加する形になります。
また、returnの前に処理が書きたいけれど、グローバルに書くのはちょっと…という方には、以下の様な方法もあります。

return call_user_func(funtion(){
    // ここに全イベント共通処理を書く
    $a = 'hogehoge';    // 例えば...

    return [
        'shutdown' => function() use ($a){
            Log::debug($a);
        },
    ];
});

 
イベントはどんなパターンのアクセスの場合も実行されるため、凝り過ぎると変なエラーが出る可能性がありますので注意してください。

 

Date::days_in_month()

この関数はその名の通り、指定した月に含まれる日数を返してくれます。

$year = 2016;
$month = 6;

$days = Date::days_in_month($month, $year);

echo $days;

// 結果は
// 30

 
ある月に含まれる日数分ループ処理を行う場合などに威力を発揮するかも知れません。
結局は以下と同義ですが、mktimeの引数の順序を覚える気がないが分からない私のような人間にとってはありがたい関数です。

$year = 2016;
$month = 6;

$days = date('j', mktime(0, 0, 0, $month + 1, 0, $year));

echo $days;

// 結果は
// '30'

 
ただ、この場合の戻り値は厳密には文字列なので、若干の違いはあります。

 

Str::increment()

これもなかなか使いどころが難しい関数ですが、文字列中のサフィックスに当たる数字をインクリメントしてくれる関数です。
エクセルで「test1」「test2」をフィルすると、「test3」「test4」が自動で作成されますが、まさにあのノリです。

セパレートする文字も指定できますし、空文字を指定すれば、セパレートされていない文字列にも対応可能です。
サフィックスとして数字が存在していない文字列に対しては、自動でサフィックスを付けるところまでやってくれますが、これが嬉しいかどうかは疑問。

$test1 = 'test';
$test2 = 'test_1';
$test3 = 'test_3';
$test4 = 'test4';
$test5 = 'test_1_5';
$test6 = 'test_';

echo Str::increment($test1);
echo Str::increment($test2);
echo Str::increment($test3);
echo Str::increment($test4, 1, '');
echo Str::increment($test5);
echo Str::increment($test6);

// 結果は
// 'test_1'
// 'test_2'
// 'test_4'
// 'test5'
// 'test_1_6'
// 'test__1'

 
余談ですが、中のソースを見てみると、文字列にいきなり数字を加算するというザッツPHPなコードが。

 

Str::truncate()

先ほどがincrementで今度がtruncateなので、SQLか?という感じですが、全く違います。

Str::truncate()は、与えられた文字列が指定文字数以上だった場合に、指定文字数以降の文字列を切り捨て、デフォルトでは「…」を付けて返す、という動作をします。

枠の中にどれだけ文字列が入ってくるか分からないけれど、改行させたくない、横幅を広げたくない、といった需要は割とあるかと思います。

そんな時は、この関数でサクッと縮めてしまいましょう。

$test = "雨ニモマケズ\n風ニモマケズ\n雪ニモ夏ノ暑サニモマケヌ\n丈夫ナカラダヲモチ\n慾ハナク\n決シテ瞋ラズ\nイツモシヅカニワラッテヰル\n一日ニ玄米四合ト\n味噌ト少シノ野菜ヲタベ\nアラユルコトヲ\nジブンヲカンジョウニ入レズニ\nヨクミキキシワカリ\nソシテワスレズ";
// 青空文庫(http://www.aozora.gr.jp/cards/000081/files/45630_23908.html) から一部抜粋

echo Str::truncate($test, 10);

// 結果は
// '雨ニモマケズ
// 風ニモ...'

 
改行コードも1文字とカウントされるようです。
FuelPHPのStrクラスは、マルチバイト文字をかなり意識して作られているので割と安心して使えます。

FuelPHPも軽量と言いながらも、こういう細かい便利関数があるところにはある、といった感じです。
また、ネタが貯まったら放出したいと思います。

 
以上です。


この記事をかいた人

About the author