ogp

Laravelの便利なヘルパ関数たち

2021-09-23

イントロダクション

Laravelには便利なヘルパ関数が多数用意されています。

自分がよく使うものを備忘録も兼ねてまとめておきたいと思います。

この記事を書いている時点で最新のLTSである、Laravel 6.xをベースに書いていきます。


デバッグの味方 dump() dd()

こいつらは備忘録に載せる必要もないぐらい開発中何度もお世話になります。

<?php
dump($params);

上記のように渡してあげると画面にダンプとして吐いてくれます。

<?php
dd($param1, $param2);

引数は可変なので、いくつ渡してもOK。

dd() 使用時はダンプ直後にスクリプトの実行を停止してくれます。

https://readouble.com/laravel/6.x/ja/helpers.html#method-dump

https://readouble.com/laravel/6.x/ja/helpers.html#method-dd


ログの出力 logger()

logger() はその名の通りログ出力をしてくれます。ログレベルはdebugになります。

<?php
logger(['foo', 'bar', 'baz']);

// local.DEBUG: array(
//     0 => 'foo',
//     1 => 'bar',
//     2 => 'baz',
// )  

/config/logging.php の設定に基づいてログに出力します。

デフォルトではファイルに出力されるので、 /storage/logs/laravel.log を確認してみましょう。


より高度に使用する場合は、引数を渡さずに呼んでロガーインスタンスを生成します。

<?php
// logger() を引数無しで呼ぶとロガーインスタンスが返ってくる
logger()->channel('stack')->error('Some error occurred.');

// Logファサードを使用しても同等の処理が記述できる
Log::channel('stack')->error('Some error occurred.');

// local.ERROR: Some error occurred.

これによってログチャンネルやログレベルを指定することが出来るようになります。

https://readouble.com/laravel/6.x/ja/helpers.html#method-logger


ロガーは設定によって一部のログだけslackに通知させるようにしたり出来るので、一度ドキュメントを読んでみると面白いです。

https://readouble.com/laravel/6.x/ja/logging.html


環境変数の取得 env()

環境変数を使用する局面は少なくないと思います。

env() はピュアPHPの getenv() と違ってデフォルト値を設定できます。

// environment variables
APP_NAME=Laravel


<?php
echo env('APP_NAME');
// Laravel

echo env('TEMP_ENV', 'default value');
// default value


配列操作時の"Undefined index"とおさらば Arr::get() data_get()

配列操作系のヘルパはたくさんあるのですが、僕はこれが一番使用頻度が高いです。

Arr::get()data_get() は、ほぼ同様の動作をするため説明は Arr::get() で書いていき、このセクションの最後に両者の違いを書こうと思います。

<?php
$array = [
    'foo' => 'Apple',
    'bar' => [
        'baz' => [
            'qux' => 'Orange',
        ],
    ],
];

上記のような配列があったとして、

<?php
echo $array['qux'];
// Undefined index: qux

このようにアクセスしようとすると、ルートにキー qux は存在しないので当然怒られます。

こんな時に Arr::get() を使用すると、存在しない場合は null を返すようになります。また、存在しない場合のデフォルト値を渡すことも可能です。

<?php
echo Arr::get($array, 'qux');
// null

echo Arr::get($array, 'qux', 'Banana');
// Banana


これだけであればphp7.0で追加されたNULL合体演算子を使用して同じようなことが出来ます。

<?php
echo $array['qux'] ?? 'Banana';
// Banana


Arr::get() を使用する利点はもう一つあり、それはネストしたキーにもドット記法でアクセスすることが出来る点です。

<?php
echo Arr::get($array, 'bar.baz.qux');
// Oragnge

echo Arr::get($array, 'bar.baz.quux', 'Banana');
// Banana

ドット記法でのアクセスはLaravelではよく使用されており、他の配列操作系ヘルパでも使用しますしセッションデータの操作などでも使用することになります。

もちろん後の例のように、ネストしたキーにアクセスしながらデフォルト値を設定することも出来ます。


Arr::get()data_get() の違い

data_get() には1つ追加で機能が備わっています。それがワイルドカードでの取得です。

<?php
$array = [
    'apple' => [
        'price' => 100,
    ],
    'orange' => [
        'price' => 150,
    ],
];

// *(ワイルドカード)で取得
dump(data_get($array, '*.price'));

// array:2 [▼
//     0 => 100
//     1 => 150
// ]

上記のように、ネストした "price" が2件返ってきます。

使い所が難しくて有用な使い方を出来たことがありませんが…一応書いておきます。

https://readouble.com/laravel/6.x/ja/helpers.html#method-array-get

https://readouble.com/laravel/6.x/ja/helpers.html#method-data-get


配列操作ラッパー collect()

配列操作系2連発ですが collect() は直接配列を操作するヘルパではなく、

配列を扱いやすくしてくれる Collection インスンタンスを返してくれるヘルパです。


ここからはヘルパの説明というよりコレクションの説明になってしまいますが、

配列を直接操作せずコレクションを使用する利点として挙げられるのは、メソッドをチェーンして使用できる点です。

また、コレクションのメソッドはすべて新しいコレクションを返すため、元の配列やコレクションを変更せずに済みます。

<?php
// 元となる配列
$array = [
    ['name' => 'foo', 'class' => 'A'],
    ['name' => 'bar', 'class' => 'A'],
    ['name' => 'baz', 'class' => 'B'],
    ['name' => 'qux', 'class' => 'B'],
];

// Collection インスタンス作成
$collection = collect($array);

// class = 'A' のみにフィルタし、name でソートする
dump($collection->where('class', 'A')->sortBy('name'));

// Illuminate\Support\Collection {#275 ▼
//     #items: array:2 [▼
//         1 => array:2 [▼
//             "name" => "bar"
//             "class" => "A"
//         ]
//         0 => array:2 [▼
//             "name" => "foo"
//             "class" => "A"
//         ]
//     ]
// }

https://readouble.com/laravel/6.x/ja/helpers.html#method-collect

https://readouble.com/laravel/6.x/ja/collections.html


HTTP例外を返す abort()

これはよく忘れるので備忘録です。

abort()HTTPException インスタンスを返し、自動的に画面描画されます。

<?php
abort(403);

403_forbidden

"Forbidden" の部分を書き換えたい場合、第2引数に渡せばそのメッセージを表示してくれます。

<?php
abort(403, 'Not admin.');

403_not_admin

abort() の親戚に abortif() abortunless() があります。

https://readouble.com/laravel/6.x/ja/helpers.html#method-abort


ひとまずここまで...

結構長くなってしまったので一旦このぐらいにしておきます。

また思いついたら別の記事かこの記事に追記しようと思います。