メインコンテンツへスキップ

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 が同様に呼び出します。ログイン画面は LoginControllerValidate::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 参照)。