🌊

Laravel Tips集 ~Helperの便利技大全~

2025/02/14に公開

Laravel Helpers Tips チートシート

Laravel には、文字列操作、ファイル操作、例外処理、日付操作など、様々な便利なヘルパー関数が用意されています。このチートシートでは、主なヘルパーの使い方とそのコード例を紹介します。


1. squish メソッド

文字列の前後の空白だけでなく、内部の余分な空白も取り除いて一行に整形します。

<?php

use Illuminate\Support\Str;

$joke = Str::squish(' PHP is dead 🤣 ');
// 結果: "PHP is dead 🤣"

2. json メソッド

Laravel 10 以降では、JSON ファイルを簡単に読み込むための File::json() メソッドが利用できます。通常の json_decode() と同じフラグも渡せます。

<?php

// Laravel < 10 の場合
$data = json_decode(File::get('data.json'), flags: JSON_THROW_ON_ERROR);

// Laravel >= 10 の場合
$data = File::json('data.json', JSON_THROW_ON_ERROR);

3. rescue ヘルパー

例外が発生しがちな処理を try-catch ブロックを使わずに、簡潔に書けます。例外発生時はデフォルト値を返します。

<?php

// 従来の書き方
try {
    $language = LanguageDetector::detect($request->ip());
} catch (Exception $e) {
    $language = 'en';
}

// rescue ヘルパーを使用した書き方(例外は報告される)
$language = rescue(fn () => LanguageDetector::detect($request->ip()), 'en');

4. scan ヘルパー

sscanf() 関数と同様に、指定したフォーマットに従って文字列を解析し、結果をコレクションとして返します。

<?php

$rgb = '#402A2A';

[$r, $g, $b] = str($rgb)->scan('#%2x%2x%2x');
// $r = 64, $g = 42, $b = 42

5. once ヘルパー

指定したクロージャの結果を一度だけ計算し、以降はキャッシュされた値を返します。静的プロパティの代替として利用可能です。

<?php

function random(): int
{
    return once(function () {
        return random_int(1, 1000);
    });
}

random(); // 例: 123
random(); // 123(キャッシュ済み)

6. throw_if / throw_unless ヘルパー

条件に応じて例外を投げる処理を、より読みやすく記述できます。

<?php

// 管理者でなければ例外を投げる
throw_if(! Auth::user()->isAdmin(), AuthorizationException::class);

// または、管理者でなければ例外を投げる(条件が成立しない場合)
throw_unless(Auth::user()->isAdmin(), AuthorizationException::class);

7. blank / filled ヘルパー

値が「空」かどうか(空文字、null、空のコレクション等)を判定する標準的な方法です。逆に、値が詰まっているかどうかもチェックできます。

<?php

blank('');            // true
blank('    ');        // true
blank(null);          // true
blank(collect());     // true

filled('string');     // true
filled([1]);          // true

8. Lottery クラス

特定の確率で処理を実行する場合に使用します。A/B テストなどで活用できる仕組みです。

<?php

use Carbon\CarbonInterval;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Lottery;

// 100 分の 1 の確率で、2秒以上かかるクエリを報告
DB::whenQueryingForLongerThan(
    CarbonInterval::seconds(2),
    Lottery::odds(1, 100)->winner(fn () => report('Querying > 2 seconds.')),
);

9. Sleep ヘルパー

PHP の sleep 関数のラッパーで、コードが読みやすく、テスト時にも扱いやすくなっています。秒、ミリ秒、マイクロ秒単位や指定日時まで待機可能です。

<?php

// 90 分待機
Sleep::for(1.5)->minutes();

// 2 秒待機
Sleep::for(2)->seconds();

// 500 ミリ秒待機
Sleep::for(500)->milliseconds();

// 5,000 マイクロ秒待機
Sleep::for(5000)->microseconds();

// 指定日時まで待機
Sleep::until(now()->addMinute());

// PHP の sleep, usleep のエイリアスも利用可能
Sleep::sleep(2);
Sleep::usleep(5000);

// メソッドチェーンも可能
Sleep::for(1)->second()->and(10)->milliseconds();

10. back ヘルパー

リダイレクト時に「戻る」処理を簡単に行えます。redirect()->back() の代わりに使用可能です。

<?php

// 従来の書き方
return redirect()->back($status = 302, $headers = [], $fallback = '/');

// back ヘルパーを使用
return back($status = 302, $headers = [], $fallback = '/');

11. words ヘルパー

指定した単語数で文字列を切り詰めることができます。フルエントな文字列操作も可能です。

<?php

use Illuminate\Support\Str;

Str::words("Don't refactor without tests.", 2);
// 結果: "Don't refactor ..."

str("Don't refactor without tests.")->words(2);
// 結果: "Don't refactor ..."

12. Benchmark ヘルパー

指定したクロージャの実行時間(ミリ秒)を測定できます。複数のシナリオを同時に測ることも可能です。

<?php

use App\Models\User;
use Illuminate\Support\Benchmark;

Benchmark::measure(fn () => User::find(1)); // 例: 0.1 ms

Benchmark::dd([
    'Scenario 1' => fn () => User::count(),
    'Scenario 2' => fn () => User::all()->count(),
]);

// 結果を変数に格納
[$count, $duration] = Benchmark::value(fn () => User::count());

13. mask メソッド

メールアドレスや認証コードなどをマスクするために利用します。文字列の長さを隠すために、他のメソッドと組み合わせても便利です。

<?php

use Illuminate\Support\Str;

Str::mask('john@example.com', '*', 3); // 結果: "joh*************"
Str::mask('98552157', '*', -5, 4);       // 結果: "985****7"

14. Human Readable Dates

Carbon の diffForHumans() を利用して、日付を「5 days ago」のように人に優しい形式で表示できます。オプションで表示部品数も指定可能です。

<?php

// 例: 5日前
$post->created_at->diffForHumans();

// 複数部品表示(例: 5 days 23 minutes ago)
$post->created_at->diffForHumans(['parts' => 2]);

15. whenFilled メソッド

リクエストパラメータなどが入力されているかをチェックし、入力があった場合と無い場合で処理を分岐できます。

<?php

$request->whenFilled('name', function (string $input) {
    // "name" が入力されている場合の処理
}, function () {
    // "name" が空の場合の処理
});

16. startOfHour メソッド

現在の時刻を「ちょうどの時(00分00秒)」に揃えたい場合に、Carbon の startOfHour() を使います。

<?php

// 現在時刻(例: 2024-04-26 18:46:39)
echo now();

// 18:00:00 に調整
echo now()->startOfHour();

17. Spell Numbers / Human-readable Numbers

Number ヘルパーを使って、数値を単語表記(spell)や人に読みやすい形式(forHumans)に変換できます。

<?php

use Illuminate\Support\Number;

Number::spell(102); // "one hundred and two"
Number::spell(88, locale: 'fr'); // "quatre-vingt-huit"

Number::forHumans(1000); // "1 thousand"
Number::forHumans(1230000, precision: 2); // "1.23 million"

18. literal ヘルパー

名前付き引数を使って、シンプルな PHP オブジェクトを生成できます。Fluent クラスも参考にしてみてください。

<?php

$obj = literal(
    name: 'Joe',
    languages: ['PHP', 'Ruby'],
);

$obj->name;      // "Joe"
$obj->languages; // ['PHP', 'Ruby']

19. abort_if / abort_unless ヘルパー

条件に応じてリクエストを中断(abort)する際に利用します。

<?php

abort_if(! Auth::user()->isAdmin(), 403);
abort_unless(Auth::user()->isAdmin(), 403);

20. Append/Prepend to Files

Storage ヘルパーを使って、ファイルの先頭や末尾に文字列を追加できます。

<?php

Storage::prepend('file.log', 'Prepended Text');
Storage::append('file.log', 'Appended Text');

21. Formatting to Percentages

Number ヘルパーの percentage() で、数値をパーセンテージ形式に整形できます。

<?php

use Illuminate\Support\Number;

Number::percentage(10); // "10%"
Number::percentage(10.123, maxPrecision: 2); // "10.12%"
Number::percentage(10, precision: 2, locale: 'de'); // "10,00%"

22. Formatting to a Human-Readable File Size

Number::fileSize() を使って、バイト数を人に読みやすいファイルサイズの表記に変換できます。

<?php

Number::fileSize(1024); // "1 KB"
Number::fileSize(1024 * 1024, precision: 2); // "1.00 MB"

23. Working with Base64 Strings

Base64 文字列の変換を、Str ヘルパーで簡単に行えます。

<?php

use Illuminate\Support\Str;

$base64 = Str::toBase64('Laravel'); // "TGFyYXZlbA=="
$decoded = Str::fromBase64('TGFyYXZlbA=='); // "Laravel"

24. Typed Configs

Config ヘルパーを使って、型安全な設定値の取得が可能です。PHPStan などの静的解析ツール向けにも有用です。

<?php

Config::string('config-key');
Config::integer('config-key');
Config::float('config-key');
Config::boolean('config-key');
Config::array('config-key');

25. Pluralize Words

Str::plural() を使って、単語を複数形に変換できます。数値を渡すと自動判定も可能です。

<?php

use Illuminate\Support\Str;

Str::plural('car', count: 2); // "cars"
str('child')->plural();       // "children"

26. Generate Random Passwords

Str::password() で、強力なランダムパスワードを生成できます。デフォルトは32文字ですが、長さも指定可能です。

<?php

use Illuminate\Support\Str;

$password = Str::password();    // 例: '?;D7zlsMmZ87R0aBmIH.>GU77nagX26U'
$password = Str::password(12);  // 例: 'q_2j00<#gr{'

27. Abbreviate Numbers

Number::abbreviate() を使って、数値を "1K" や "1.23M" のように短縮表示できます。

<?php

use Illuminate\Support\Number;

Number::abbreviate(1000);             // "1K"
Number::abbreviate(489939);           // "490K"
Number::abbreviate(1230000, precision: 2); // "1.23M"

28. chopStart / chopEnd メソッド

Laravel 11.14 から、文字列の先頭や末尾から指定文字を取り除く便利なメソッドが利用できます。

<?php

use Illuminate\Support\Str;

$url = Str::chopStart('http://laravel.com', ['https://', 'http://']); // "laravel.com"
$url = Str::chopEnd('app/Models/Photograph.php', '.php');              // "app/Models/Photograph"

29. Swap Multiple Strings

Str::swap() を使えば、複数の文字列の置換を一度に行えます。

<?php

use Illuminate\Support\Str;

$string = Str::swap([
    'Tacos' => 'Burritos',
    'great' => 'fantastic',
], 'Tacos are great!');
// 結果: "Burritos are fantastic!"

30. Count the Words

Str::wordCount() を使って、文字列中の単語数をカウントできます。

<?php

use Illuminate\Support\Str;

Str::wordCount('Okay, this helper is so cool!'); // 6

31. last / head ヘルパー

配列の最初または最後の要素を簡単に取得できます。

<?php

$array = [100, 200, 300];

head($array); // 100
last($array); // 300

32. Filter Null Values

Arr::whereNotNull() を使って、配列から null 値を除外できます。

<?php

use Illuminate\Support\Arr;

$array = [0, null, 'hello, world'];
$filtered = Arr::whereNotNull($array);
// 結果: [0 => 0, 2 => "hello, world"]

33. Truncate Long Strings

Str::limit() を使って、長い文字列を指定した長さで切り詰めることができます。今後、単語単位での切り詰めもサポート予定です。

<?php

use Illuminate\Support\Str;

Str::limit('This will be a long description', 10); // "This will ..."
Str::limit('This will be a long description', 10, ' ( ... )'); // "This will ( ... )"

34. Deduplicate Characters

Laravel 11.20 以降、Str::deduplicate() を使って、指定した文字の重複を取り除けます。

<?php

Str::deduplicate('Laravel Framework'); // "Laravel Framework"
Str::deduplicate('Laravel Frameworkkkkk', 'k'); // "Laravel Framework"

35. Ensure Env Keys Exist

Env::getOrFail() を使うと、.env ファイルに指定したキーが存在しない場合に例外を投げ、設定漏れを防止できます。

<?php

use Illuminate\Support\Env;

return [
    'postmark' => [
        'token' => Env::getOrFail('POSTMARK_TOKEN'),
    ],
];

36. Safer Passwords for Users

ユーザーが流出したパスワードを再利用しないよう、uncompromised ルールを利用して安全なパスワードを要求できます。

<?php

// Have I Been Pwned API を利用してチェック
Password::min(8)
    ->mixedCase()
    ->numbers()
    ->letters()
    ->uncompromised();

37. Auto Capitalize Your Translations

翻訳文字列にパラメータを渡す際、自動的に大文字化する機能があります。

<?php

// en/messages.json
return [
    'welcome' => 'Welcome, :NAME',
    'goodbye' => 'Goodbye, :Name',
];

// 呼び出し時に自動で大文字化
echo __('messages.welcome', ['name' => 'dayle']); // "Welcome, DAYLE"
echo __('messages.goodbye', ['name' => 'dayle']); // "Goodbye, Dayle"

38. data_get ヘルパー

dot 記法やワイルドカードを使って、ネストされた配列から値を取得できます。

<?php

$data = [
    'product-one' => ['name' => 'Desk 1', 'price' => 100],
    'product-two' => ['name' => 'Desk 2', 'price' => 150],
];

data_get($data, 'product-one.name'); // "Desk 1"
data_get($data, '*.name');           // ["Desk 1", "Desk 2"]

39. Pipeline ヘルパー

複数の処理をパイプラインのように連鎖して実行できます。各処理は独立したクラス(インボーカブル)として定義します。

<?php

$user = Pipeline::send($user)
    ->through([
        GenerateProfilePhoto::class,
        ActivateSubscription::class,
        SendWelcomeEmail::class,
    ])
    ->then(fn(User $user) => $user);

// 例: GenerateProfilePhoto クラス
class GenerateProfilePhoto
{
    public function __invoke(User $user, Closure $next)
    {
        // プロフィール写真の生成処理
        return $next($user);
    }
}

40. tap ヘルパー

ある処理を行った後、対象オブジェクトをそのまま返したい場合に利用します。メソッドチェーンと組み合わせると便利です。

<?php

public function markAsPaid(): self
{
    // 通常の書き方
    $this->update(['status' => 'paid']);
    return $this;

    // tap ヘルパーを使うと簡潔に
    return tap($this)->update(['status' => 'paid']);
}

41. Execute Tasks Concurrently

Laravel 11.23 以降、独立したタスクを同時並行で実行できます。これにより、処理速度を向上させることができます。

<?php

use App\Services\Metrics;
use Illuminate\Support\Facades\Concurrency;

Concurrency::defer([
    fn () => Metrics::report('users'),
    fn () => Metrics::report('orders'),
]);

42. A Better dd()

コレクションやクエリ結果のデバッグ時に、dd() をチェーンして直接結果をダンプできます。

<?php

// 従来の書き方
$users = User::all();
dd($users);

// 改善例
User::all()->dd();

43. today() ヘルパー

本日の日付を簡単に取得でき、タイムゾーン指定や他の Carbon メソッドとの連携も可能です。

<?php

$today = today();
today()->isWeekend(); // 週末かどうかのチェック

44. Get the Age of a Date

Carbon の age プロパティを使って、日付から年齢を計算できます。

<?php

use Illuminate\Support\Carbon;

$laravelsAge = Carbon::parse('01-06-2011')->age;
$age = User::first()->birthday->age;

45. Get the Closest and Farthest Dates

Carbon の closest() と farthest() メソッドを使えば、指定した2つの日付のうち、対象に近い方や遠い方を取得できます。

<?php

use Illuminate\Support\Carbon;

$date = Carbon::parse('2024-05-15');
$date1 = Carbon::parse('2024-01-01');
$date2 = Carbon::parse('2024-05-16');

$date->closest($date1, $date2); // 2024-05-16
$date->farthest($date1, $date2); // 2024-01-01

46. File Checksum

Storage::checksum() を使えば、ファイルのチェックサムを生成して改ざん検知などに利用できます。

<?php

Storage::checksum('/path/to/file', ['checksum_algo' => 'sha1']);

47. shortRelativeDiffForHumans メソッド

diffForHumans() の短縮版で、例えば "5d ago" のように短く表示できます。

<?php

now()->subDays(5)->diffForHumans();             // "5 days ago"
now()->subDays(5)->shortRelativeDiffForHumans();  // "5d ago"

48. finish ヘルパー

文字列の末尾が指定した文字で終わっているかをチェックし、足りなければ補完します。

<?php

use Illuminate\Support\Str;
 
Str::finish('this/string', '/'); // "this/string/"
Str::finish('this/string/', '/'); // "this/string/"

49. diffInDaysFiltered メソッド

2つの日付間の日数を、特定の条件(日曜や土曜を除くなど)でフィルタリングしてカウントできます。

<?php

$start = now();
$end = now()->addDays(10);

$weekdays = $start->diffInDaysFiltered(fn (Carbon $date) => !$date->isWeekend(), $end);
// 例: 平日の日数が返る(8日)

50. isBirthday メソッド

指定した日付が、ある日付の誕生日かどうかをチェックできます。

<?php

use Illuminate\Support\Carbon;

$born = Carbon::createFromDate(1987, 4, 23);

$noCake = Carbon::createFromDate(2014, 9, 26);
$yesCake = Carbon::createFromDate(2014, 4, 23);

$born->isBirthday($noCake); // false
$born->isBirthday($yesCake); // true

51. headline メソッド

文字列をタイトルケースに変換します。スネークケースやキャメルケースの文字列を読みやすい形にできます。

<?php

Str::headline('a_cool_title');           // "A Cool Title"
Str::headline('EmailNotificationSent');  // "Email Notification Sent"
str('a_cool_title')->headline();         // "A Cool Title"

52. Sort Arrays Recursively

Arr::sortRecursive() で、多次元配列も含めて再帰的にソートできます。降順ソートも可能です。

<?php

use Illuminate\Support\Arr;
 
$array = [
    ['PHP', 'Ruby', 'JavaScript'],
    ['one' => 1, 'two' => 2, 'three' => 3],
];
 
Arr::sortRecursive($array);
Arr::sortRecursiveDesc($array);

53. data_forget ヘルパー

dot 記法を使って、ネストした配列から特定のデータを削除できます。

<?php
 
$data = ['products' => ['desk' => ['price' => 100]]];
 
data_forget($data, 'products.desk.price');
// 結果: ['products' => ['desk' => []]]

54. doesntContain メソッド

文字列が特定の文字列を含まないかを確認できます。従来は contains() の否定を使っていましたが、より直感的です。

<?php

use Illuminate\Support\Str;

if (Str::doesntContain('Larvel forever', 'Laravel')) {
    // "Laravel" が含まれていないため、修正処理を実行
}

55. Spell Ordinal Numbers

Laravel v11.34 から、Number::spellOrdinal() を使って序数(3rd, third など)を文字列として表現できます。

<?php

use Illuminate\Support\Number;
 
Number::ordinal(3);       // "3rd"
Number::spellOrdinal(3);  // "third"

56. keyBy メソッド

Eloquent コレクションや配列を、指定したキーで連想配列に変換できます。

<?php

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

$keyed = $collection->keyBy('product_id');
/*
結果:
[
    'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
    'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]
*/

57. remove メソッド

文字列から指定した文字列(または複数)を削除できます。大文字小文字のオプションも指定可能です。

<?php

use Illuminate\Support\Str;

$string = 'Peter Piper picked a peck of pickled peppers.';
Str::remove('e', $string, caseSensitive: false); // "Ptr Pipr pickd a pck of pickld ppprs."
Str::remove(['e', 'i', 't'], $string);            // "Pr Ppr pckd a pck of pckld ppprs."

58. Check If a String Is a URL

Str::isUrl() を使って、文字列が有効な URL かどうか、指定したプロトコルもチェックできます。

<?php

use Illuminate\Support\Str;
 
Str::isUrl('http://valid-url.com', ['https', 'http']); // true
Str::isUrl('ftp://yourserverdomain.com');                // true
Str::isUrl('non-valid-url');                             // false

元記事

https://github.com/OussamaMater/Laravel-Tips/blob/main/tips/helpers.md

Discussion