Windowsで作る - PHPプログラミングの開発環境
このページへのアクセス 今日: 1 / 昨日: 0 総計: 2035
文書の過去の版を表示しています。
編集中
— y2sunlight 2020-08-25
Apricot ドキュメント に戻る
目次
Apricotでは Valitron を使いサーバ側のバリデーションで使用します。詳しい使い方やメソッドについては Valitron の READMEを参照して下さい。
Valitron の典型的な使用例を示します:
$input = ['account' => 'root']; // フォームの入力変数を取得する $v = new Valitron\Validator($input); // バリデータを作る $v->rule('required', 'account'); // ルールを適用する if(!$v->validate()) // 検証する { $errors = $v->errors(); // 失敗の時は、入力変数とエラー内容を伴って前ページにリダイレクトする }
以下はApricotが提供している初期のValitronの設定ファイル( validator.setting.php )です。
validator.setting.php
** /your-project/config/setting **
<?php /** * This file contains Valitron\Validator settings. */ $lang = \Apricot\Lang::getLangCode(); return [ 'lang_dir' => assets_dir('lang/'.$lang), 'lang' => 'vlucas.valitron', ];
lang_dir の 初期設定値は /your-project/assets/lang/{LangCode} で、{LangCode} はISO 639-1で定義された2文字の言語コードです。Apricotはこの言語コードをセットアップ時に自動取得します。
lang_dir
/your-project/assets/lang/{LangCode}
{LangCode}
lang は 言語ファイル名から拡張子を除いたベース名を指定します。この例の場合、実際の言語ファイル名は vlucas.valitron.php になります。利用者が英語で使用している場合、言語ファイルのフルパスは、以下のようになります:
lang
vlucas.valitron.php
/your-project/assets/lang/en/vlucas.valitron.php
多言語化についての詳細は「フロントエンド」を参照して下さい。
Valitron には以下のセットアップファイルが存在します。
** /your-project/config/setup **
<?php /** * Initial settings of Valitron\Validator */ return function():bool { \Valitron\Validator::langDir(config('validator.lang_dir')); \Valitron\Validator::lang(config('validator.lang')); //------------------------------------------------------------------- // Adds custom rules //------------------------------------------------------------------- /* * unique rule: Check for unique attributes * [Example] rule('unique','Unique column name','Table name','ID column name') */ Valitron\Validator::addRule('unique', function($field, $value, array $params, array $fields) { if (count($params)<1) return false; $query = ORM::forTable($params[0])->where($field, $value); if ((count($params)>1) && array_key_exists($params[1], $fields)) { $id_field = $params[1]; $query = $query->where_not_equal($id_field, $fields[$id_field]); } $users = $query->findOne(); return ($users===false); }, 'is not unique'); return true; // Must return true on success };
Apricotのスケルトンでは、上の例のように、言語ファイルの場所を設定した後、Valitron\Validator::addRule() メソッドを使ってカスタムルール( 'unique' )を追加しています。新しいルールを追加するには、上の例を参考にして下さい。addRule() メソッドについては Valitron のREADME を参照して下さい。
Valitron\Validator::addRule()
addRule()
uniqueルールはデーターベースのユニーク制約の為のルールです。
使用法: rule('unique', $unique_column_name, $table_name, $id_column_name)
userテーブルのaccountカラムがユニーク制約を持っている場合、バリデーションルールは以下のように設定します。
$v = new \Valitron\Validator($inputs); $v->rule('unique','account', 'user', 'id');
「Valitronの設定」でも述べたようにバリデーション用の言語ファイルは、初期設定では、以下のディレクトリに言語毎に配置されています。
/your-project/assets/lang/{Language Code}/vlucas.valitron.php
言語ファイルの内容は、バリデーション失敗時のメッセージです。これらのファイルは、アプリケーションでサポートする全ての言語毎に作成して下さい。デフォルトの言語は、環境変数 APP_LANG で指定してます。
以下の初期実装されている言語ファイルの抜粋を示します。配列のキーがルールー名、値がメッセージです。
** /your-project/assets/lang/ja **
<?php return array( 'required' => "を入力してください", 'equals' => "は「%s」と同じ内容を入力してください", 'numeric' => "は数値を入力してください", 'integer' => "は半角数字で入力してください", 'length' => "は%d文字で入力してください", 'min' => "には%sより大きな値を入力してください", 'max' => "には%sより小さな値を入力してください", 'email' => "の書式が正しくありません", 'url' => "はURLの書式として正しくありません", 'alpha' => "は半角英字で入力してください", 'alphaNum' => "は半角英数字で入力してください", 'ascii' => "は半角文字で入力して下さい", 'unique' => "は既に使用されています", // ... );
エラーが発生した場合、メッセージの前にはエラーの対象となった入力変数の名前が付きます。例えば以下の場合:
$v =(new \Valitron\Validator($inputs)) $v->rule('required', 'account');
エラー発生時のメッセージは「accountを入力してください」になります。「account」を「ユーザアカウント」のようなラベルに変更したい場合は、labels() メソッドを使用して次のようにします。
labels()
rule('required', 'account'); $v->labels(['account' => 'ユーザアカウント']);
App\Foundation\ValidatorErrorBag クラスはApricotコアの Apricot\Foundation\ErrorBag を継承したバリデーション用のエラーバッグクラスです。
App\Foundation\ValidatorErrorBag
ValidatorErrorBag には、'validator' という名前が付いています。この名前によって他のエラーバッグと区別することができます。'ValidatorErrorBag'のコンストラクターの引数は '' Valitron\Validator '' の errors() メソッドから返される連想配列です。
ValidatorErrorBag
errors()
以下は、コントローラ(またはインターセプター)内での ValidatorErrorBag の典型的な使用方法です:
if(!$v->validate()) // 検証する { $errorBag = new ValidatorErrorBag($v->errors()); // 入力変数とエラー内容を伴って前ページにリダイレクトする return redirect(back())->withInputs()->withErrors($errorBag); }
ValidatorErrorBag で使えるメソッドについては「エラーバッグ」を参照して下さい。
以下は、HTMLテンプレード内でエラーバッグの使用例です。
@if($errors->count()) @foreach($errors as $key=>$value) {{$value}}<br> @endforeach @endif
$errors はフレームワークによって自動的に作られる ErrorBag 型のテンプレート変数です。レスポンスインスタンスの withErrors() メソッド によってフラッシュに格納されたエラーバッグは、$errorsで取り出すことができます。
$errors
ErrorBag
withErrors()
インターセプターメソッドのシグネチャには次の規則があります:
以下にユーザインターセプター( UserInterceptor )を示します。
** /apricot/app/Controllers/Interceptors **
<?php namespace App\Controllers\Interceptors; use Apricot\Input; use App\Foundation\Controller; use App\Foundation\ValidatorErrorBag; /** * User Interceptor */ class UserInterceptor { /** * Interceptor for insert method. * * @return void|\Apricot\Foundation\Response return Response if failed */ public function insert(Controller $controller) { $inputs = Input::all(); // Validation $v =(new \Valitron\Validator($inputs)) ->rule('required', ['account','password']) ->rule('alphaNum','account') ->rule('unique','account','user','id') ->rule('ascii','password') ->rule('equals','password','password_confirmation') ->rule('email', 'email') ->labels(inputLabels('messages.user.create')); if(!$v->validate()) { $errorBag = new ValidatorErrorBag($v->errors()); return redirect(back())->withInputs()->withErrors($errorBag); } // Removes unnecessary inputs Input::remove('password_confirmation'); } /** * Interceptor for update method. * * @param int $id * @return void|\Apricot\Foundation\Response return Response if failed */ public function update(Controller $controller, int $id) { $inputs = Input::all(); // Validation $v =(new \Valitron\Validator($inputs)) ->rule('ascii','password') ->rule('equals','password','password_confirmation') ->rule('email', 'email') ->labels(inputLabels('messages.user.create')); if(!$v->validate()) { $errorBag = new ValidatorErrorBag($v->errors()); return redirect(back())->withInputs()->withErrors($errorBag); } // Removes unnecessary inputs Input::remove('password_confirmation'); } }
バリデーションの手順は以下の通りです。
required
alphaNum
unique
ascii
equals
email