一言概要
make:rule は Laravel の Artisan コマンドで、カスタムバリデーションルールを 単体テスト可能 に作成できます。
TL;DR
- 使い方:
php artisan make:rule MyCustomRule - ポイント
implements Ruleを忘れないpasses/messageを実装--forceで上書き
概要
make:rule は app/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

