Laravel Tips集 ~Helperの便利技大全~
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
元記事
Discussion