2017-01-07 16 views
1

私はモデルへの検証を移動中です(watson/validatingパッケージ)。しかし、いくつかの検証ルールは移動できません。たとえば、ユーザー登録フォームを検討してください。パスワードを6文字以下にする必要があります。モデルではパスワードのハッシュを取得しているので、モデルではできません。Laravelで各フィールドの検証エラーを報告するにはどうすればよいですか?

しかし、パスワードがコントローラの検証ルールに合格しなかった場合、コントローラの検証によるエラーだけが報告されます。私は明らかにユーザーがcontrollermodelの両方の結果を見るのが好きです。

+0

どちらの状況でどちらが必要ですか?アイデアは私には重複しているようです。 –

+0

@ ErikBerkun-Drevnig私はそれを記述していない?一般に、モデルを作成するたびにモデルを複製しないように、モデルの検証を行いたいとします。しかし、パスワードの検証ではなく、モデル内でハッシュを取得しているため、モデルの最小長のパスワード検証は実行できません。 –

+0

私が言っていることは、あなたのモデルに入れたデータは通常コントローラから来ているので、要求の検証は十分であるということです。値そのものがすでに検証されている場合、どのような状況でモデルを検証しますか? –

答えて

0

は、ここで私が思い付いたものです:

class RegisterController extends Controller 
{ 
    protected function validator(array $data) 
    { 
     $rules = merge_validation_rules((new User)->getRules(), [ 
      'email' => 'required', 
      'password' => 'min:6', 
     ]); 
     return Validator::make($data, $rules); 
    } 
    ... 

merge_validation_rulesヘルパー:

function merge_validation_rules($a, $b) 
{ 
    $r = $a; 
    foreach ($b as $k => $v) 
     if (isset($a[$k])) { 
      $r[$k] = array_merge(explode('|', $a[$k]), explode('|', $b[$k])); 
      if (in_array('sometimes', $r[$k]) 
      && in_array('required', $r[$k])) 
       $r[$k] = array_diff($r[$k], ['sometimes']); 
      $r[$k] = implode('|', $r[$k]); 
     } else 
      $r[$k] = $b[$k]; 
    return $r; 
} 

merge_validation_rulesテスト:ここ

<?php 

namespace Tests; 

use Tests\TestCase; 

class HelpersTest extends TestCase 
{ 
    /** 
    * @dataProvider mergeValidationRulesProvider 
    */ 
    function testMergeValidationRules($input, $output) 
    { 
     $r = call_user_func_array('merge_validation_rules', $input); 

     $this->assertEquals($output, $r); 
    } 
    function mergeValidationRulesProvider() { return [ 
     [[['a' => 'ra1', 'b' => 'rb1'], ['a' => 'ra2', 'c' => 'rc1']], 
      ['a' => 'ra1|ra2', 'b' => 'rb1', 'c' => 'rc1']], 
     [[['a' => 'sometimes'], ['a' => 'required']], 
      ['a' => 'required']], 
    ]; } 
} 

使用すると、1つの以上の問題を見ることができます。私はユーザー/パスワードとソーシャルログインの両方を使用しています。したがって、電子メールは常に存在するとは限りません(すべてのソーシャルネットワークが返すわけではありません)。だからモデルでは私は'email' => 'sometimes|email'を持っていますが、登録コントローラーではrequiredにして欲しいです。今のところ、requiredがある場合はsometimesを削除します。それがうまくいくかどうかがわかります。

1

Form Request objectsdatabase constraintsの組み合わせをお勧めします。こうすることで、コントローラからフォーム検証を抽出し、フィールドが似ている場合は複数の要求に対して再利用することができます。

これにより、ユーザーがデータベースに不正なデータを取得するのを防ぐことができます。ただし、正しい検証オブジェクトの使用を怠った場合、他の開発者がデータをデータベースに挿入することはできません。データベースの制約はこれを補うことができますが、あなたが記述していることはフレームワークの一部ではありません。

幸運を祈る!

関連する問題