make:rule — バリデーションルールクラスを作成するコマンド

artisan

一言概要

make:rule は Laravel の Artisan コマンドで、カスタムバリデーションルールを 単体テスト可能 に作成できます。


TL;DR

  • 使い方: php artisan make:rule MyCustomRule
  • ポイント
  • implements Rule を忘れない
  • passes / message を実装
  • --force で上書き

概要

make:ruleapp/Rules ディレクトリに Illuminate\Contracts\Validation\Rule インターフェースを実装したクラスを生成します。
生成されたルールは フォームリクエストモデル で再利用でき、ロジックを外部に分離してテスト容易性を高めます。


構文 / シグネチャ

php artisan make:rule {name} [--force]
引数 必須 既定値 説明
name string ✔︎ 生成するルールクラス名
force bool false 既存ファイルを上書きするか
  • 戻り値:生成ファイルへのパス(文字列)
  • 例外FileNotFoundException は発生しません(ファイルは常に作成されます)

実務例

1. ルールクラスを生成

php artisan make:rule EmailDomainRule

生成されるファイル (app/Rules/EmailDomainRule.php):

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Str;

class EmailDomainRule implements Rule
{
    protected string $allowedDomain;

    public function __construct(string $domain)
    {
        $this->allowedDomain = $domain;
    }

    public function passes($attribute, $value): bool
    {
        return Str::endsWith($value, '@' . $this->allowedDomain);
    }

    public function message(): string
    {
        return 'The :attribute must be a valid email at ' . $this->allowedDomain;
    }
}

2. フォームリクエストで使用

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\EmailDomainRule;

class StoreUserRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'email' => ['required', 'email', new EmailDomainRule('example.com')],
        ];
    }
}

よくある落とし穴

症状 原因 対処
Command "make:rule" is not defined. Artisan キャッシュが古い php artisan config:clear && php artisan cache:clear
Class "Rule" not found use Illuminate\Contracts\Validation\Rule; を忘れた ファイル先頭に追加
Undefined variable: domain コンストラクタで渡さなかった new EmailDomainRule('example.com') を呼び出し
既存ファイルに上書き失敗 ファイルが存在している --force を付けて再実行

テスト例(Pest)

use App\Rules\EmailDomainRule;

it('validates email domain', function () {
    $rule = new EmailDomainRule('example.com');

    expect($rule->passes('email', 'user@example.com'))->toBeTrue();
    expect($rule->passes('email', 'user@another.com'))->toBeFalse();
});

代替・比較

手段 長所 短所
make:rule ルールを単体でテストしやすい コマンド実行が必要
make:request + Validator::make すぐに使用できる ルールがメソッド内に隠れる
FormRequest 内にバリデーションロジック コントローラが簡潔 再利用性が低い

選定基準

  • 再利用性: 共通ルールは make:rule
  • プロジェクト規模: 小規模は FormRequest でも可
  • テスト: ルール単体テストが必要なら make:rule

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする