2015.11.17
0からはじめるPHP#56【TDDで作り直す掲示板#4-日本語のバリデーションテスト-】
結論から言うと
このままでは日本語でのバリデーションエラー表示とテストは両立不可能だと思います。
name属性に英文字しか使えない制約の意図は分かりませんが、調べたところ
正式には使ってはいけないことになってると規定されているので、Laravelもそれに準拠した形なんでしょう・・・・・・たぶん。
name属性の複数指定とか試してみたんですが、どうも上手く動かないようで。とりあえずこのままでは無理です。
ですが、エラーメッセージが
「nameは入力必須です」「mailの書式が正しくありません」だと不格好ですよね。システムの信頼性を損ないます。
ということで最終手段として、今回は
テスト対応のバリデーションに手を出しましょう。
方法は大きく分けて
「エラーメッセージを個別に設定する」「name属性を読み替える」の2通りの方法があるのですが、後者の方が実用性があるのでそちらを採用します。
つまり、name属性は
name="name"とでもしておくとすると、通常だと「nameが・・・・・・」の表示になるところを
「name」を「名前」に置き換えるという操作をするということです。
これは
Requestクラスにattributes()を作ることで解決できます。
ここを参照にしつつ、わかりやすい
こちらも見て学習しましょう。
|
php artisan make:request リクエスト名
|
コマンドプロンプトにてこのようなものを実行するとリクエストクラスを作ることができます。
これはコントローラーが呼ばれる前に実行されます。
namespace App\Http\Requests;
use App\Http\Requests\Request;
class MyRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
//↓これを追加
public function attributes() {
return [
'login_id' => 'ユーザID',
'password' => 'パスワード',
];
}
}
ここにattributes()を追加します。
上の例では、「login_id」が「ユーザID」に、「password」は「パスワード」にそれぞれ置き換わります。
エラーメッセージを表示する時だけ日本語であれば良いわけで、不要なバグを生まないためにもなるべくこの手法を使ってエラーを表示したいところですね。
で、ついでなのでここで
フォームリクエストでバリデーションしてみましょう。
やることは2つです。
1.rules()メソッドにバリデーション内容を入れる。(マニュアル見れば簡単です)
2.authorize()の返り値をtrueにする。
3.コントローラーの引数にこのクラス名を設定する。
2.を忘れるとfobiddenが返ってきて進まなくなります。
具体的な実装はマニュアル見れば猿でもわかるレベルなので簡単に。
public function post(MyRequest $request){
///省略///
}
class MyRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;//無条件で認証させる(=ログインシステム等の実装なし)
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|no_ctrl_chars|max:256',
'mail' => 'email|max:256',
'URL' => 'no_ctrl_chars|url|max:2000',
'title' => 'required|no_ctrl_chars|max:256',
'default_color' => ["required",'regex:/[0123456789aAbBcCdDeEfF]{6,6}|free/'],
'form_color' => ['regex:/[0123456789aAbBcCdDeEfF]{6,6}|free/'],
'content' => 'required|no_ctrl_chars_Lb|max:5000',
];
}
public function attributes() {
return [
"name" => "名前",
"mail"=>"メール",
"title"=>"件名",
"default_color"=>"文字色",
"form_color"=>"色コード",
"content"=>"本文",
];
}
}
たぶんこれで良いと思います。
これで、name属性は英文字で、かつエラーメッセージを日本語にすることが可能です。
次回は上のバリデーションの中にある
no_ctrl_charsなどに関してコメントというか、参考にしたサイトの間違い等で苦戦した話とかしましょうかね。(笑)