blocs/blocs: Validate クラスとテンプレートバリデーションの実行
blocs/blocs: Validate クラスとテンプレートバリデーションの実行
テンプレート側で指定した data-validate(No.2.10)を、Laravel のバリデーションとして実行するのが Blocs\Validate クラスです。管理画面の StoreTrait / UpdateTrait は内部でこのクラスを呼び出します。
前提条件: 対象テンプレートが一度コンパイルされ、JSON キャッシュ(validate / message / filter キー)が生成されていること(No.2.1 参照)。
処理の流れ
flowchart LR
A["テンプレート(data-validate)"] --> B["コンパイル時に JSON キャッシュへ保存"]
B --> C["Validate::get() で rules / messages を取得"]
C --> D["$request->validate() で実行"]
data-filter で指定した変換は、Validate::get() 呼び出し時にリクエストへ自動適用されます(filter() メソッド経由)。
主なメソッド
| メソッド | 説明 |
|---|---|
get($templateName, $request = null) |
ルール配列とメッセージ配列を [rules, messages] で返す。$request を渡すと filter を適用 |
rules($templateName) |
ルール配列のみ返す |
messages($templateName) |
メッセージ配列のみ返す |
upload($templateDir, $formName) |
ai-upload 用のルール・メッセージを返す(JSON の upload キー。No.2.13 / No.5.5) |
filter($templateName, $requestAll) |
data-filter に基づき入力値を変換 |
$templateName にはビュープレフィックス付きのテンプレート名を渡します(例: admin.user.create)。
管理画面での利用(StoreTrait の例)
[$rules, $messages] = Validate::get($this->viewPrefix.'.create', $this->request);
if (! empty($rules)) {
$labels = $this->getLabel($this->viewPrefix.'.create');
$this->request->validate($rules, $messages, $labels);
}
編集時は Validate::get($this->viewPrefix.'.edit', $this->request) を UpdateTrait が同様に呼び出します。ログイン画面は LoginController が Validate::get($this->viewPrefix.'.login', $request) を使用します。
カスタムルールの自動解決
ルール名が App\Rules\{クラス名} として存在する場合、BLOCS がインスタンス化します(No.2.11 参照)。data-lang で指定したメッセージはコンストラクタの最終引数として渡されます。
<!-- !email="softUnique:users" data-lang="メールアドレスはすでに登録されています。" -->
アップロードのバリデーション
FileTrait::upload() は Validate::upload($this->viewPrefix, $paramname) でルールを取得し、通常のフォームバリデーションとは別ルートで検証します。
カスタムコントローラーでの手動利用
Base を継承しないコントローラーでも、テンプレートにバリデーションを書いておけば同じ API で利用できます。
use Blocs\Validate;
[$rules, $messages] = Validate::get('admin.custom.form', $request);
$request->validate($rules, $messages);
ルールが空の場合は [[], []] が返ります。テンプレートのパスやキャッシュの不整合がないか確認してください(No.7.2 参照)。