【问题标题】:Laravel 5 Validation Not Catching ErrorsLaravel 5 验证未捕获错误
【发布时间】:2015-08-06 23:55:07
【问题描述】:

我太新手了,不知道如何正确追踪这个问题,所以希望这里有人可以帮助我。

验证器不再在我的 Laravel 5 应用程序中工作。它不会捕获错误。一切都会过去。我已经缩小了我的代码范围,以便在提交表单时在验证器上做一个简单的模具和转储,如下所示:

public function postRegister(Request $request){
    $validator = $this->registrar->validator( $request->all() );
    dd($validator);
}

Registrar 验证器方法是:

public function validator( array $data )
{
    return Validator::make( $data, [
        'username'   => array('required, regex:/^[a-zA-Z0-9\-\s]+$/, max:20'),
        'email'      => 'required|email|max:255|unique:users',
        'password'   => 'required|confirmed|min:6',
        'honeyfield' => 'size:0',
        'unhuman'    => 'boolean:0',
        'honeytime'  => 'honeytimer:7'
    ] );
}

(“honeytimer”是使用验证器服务提供商设置的自定义验证)。

现在,如果我提交一个错误填写的表单,我会返回一个包含所有已定义规则的 Validator 对象,但会返回一个空的 #failedRules 数组,如果我死掉并转储 $request,则不会出现错误包。

如果我死了并转储 $validtor->fails(),它返回 true,但是当我尝试使用 $validator->failed() 检索数组时,它是空的。

进一步详细说明(特别感谢@shaddy 帮助清除此问题)常规方法(如下)首先检查验证是否失败,但它似乎没有注册它,因为它只是继续,并尝试创建用户。

public function postRegister( Request $request )
{
    $validator = $this->registrar->validator( $request->all() );

    if( $validator->fails() ) {
        $this->throwValidationException(
            $request, $validator
        );
    }

    $this->auth->login( $this->registrar->create( $request->all() ) );

    \Session::flash( 'new_registration', true );

    return redirect()->intended( '/' );
}

首次实施时一切正常。因此,很明显,我在过去几天对应用程序的其他部分进行了一些更改,导致了这种情况。当然,我已经测试了我能想到的所有东西(就我所做的更改而言),但似乎没有任何改变。

这可能与加载类的顺序有关吗?我在这里想念什么?我敢肯定这是显而易见的,但我真的可以使用一些建议。提前致谢。

【问题讨论】:

  • 看我的回答here
  • 谢谢@shaddy,但我想弄清楚为什么验证器一开始就不起作用。我知道表单请求,但这只是管理验证的另一种方式。它不能解决验证器不工作的问题(这与您提到的问题中的问题不同)。不过,我很欣赏您的意见。再次感谢。 :-)

标签: validation laravel laravel-5


【解决方案1】:

感谢大家的帮助!对于将来遇到这种情况的任何人,事实证明,按照 Laravel 5 文档的建议(尽管不是必需的)将正则表达式规则放在一个数组中:http://laravel.com/docs/5.0/validation#rule-regex,在我的情况下是罪魁祸首。将其改回管道分隔符解决了这个问题。

所以,改变:

'username'   => array('required, regex:/^[a-zA-Z0-9\-\s]+$/, max:20')

到...

'username' => 'required|regex:/^[a-zA-Z0-9\-\s]+$/|max:20'

...导致验证正常工作。当然,我可能没有正确设置阵列。如果是这种情况,欢迎输入。无论哪种方式,管道定界都成功了。

编辑:

@Codel96 在他们的回答中指出了这一点。我一开始就没有正确设置数组。

【讨论】:

    【解决方案2】:

    你应该有类似的东西

    array('required', 'regex:...')
    

    而不是

    array('required, regex...')
    

    这没有任何意义。您的每条验证规则都应该由管道分隔,或者是数组中的单个列。

    【讨论】:

      【解决方案3】:

      失败的数组是空的,因为你只是创建了验证器的新实例。您实际上并未触发验证。

      所以你可以这样做来触发验证并检查它是否失败:

      public function postRegister(Request $request){
          $validator = $this->registrar->validator( $request->all() );
          dd($validator->fails());
      }
      

      您还可以访问一组失败的验证规则,而不显示消息。为此,请使用失败的方法:

      $failed = $validator->failed();
      

      您可以在documentation 中查看更多示例。

      编辑

      现在,在我看到你的整个代码之后,我可以说你需要处理出现错误的情况:

      public function postRegister( Request $request )
      {
          $validator = $this->registrar->validator( $request->all() );
      
          if( $validator->fails() ) {
              // Validator fails, return to the previous page with the errors
              return Redirect::back()->withInput()->withErrors( $validator );
          }
      
          $this->auth->login( $this->registrar->create( $request->all() ) );
      
          \Session::flash( 'new_registration', true );
      
          return redirect()->intended( '/' );
      }
      

      【讨论】:

      • 我应该提到我已经尝试过 $validator->failed() 了。我将对问题进行编辑。有趣的是 $validator->fails() 在我 dd() 时返回 true,但它不会在常规的 postRegister() 方法中被拾取。 (我将在上面进行更详细的编辑)。再次感谢@shaddy。我很感激帮助。 :-)
      • @DonnaJo 如果你在你的 postRegister 方法中这样做 if ($validator->fails()) die('test'); 会发生什么?
      • 在我看来验证器正在工作,您只是没有正确处理验证错误。您可以在检查错误后粘贴整个代码吗? :)
      • 见上面的常规方法。我会尝试 if ($validator->fails()) die('test');现在,让你知道。好的。刚试了一下。我回来测试了。
      • 正如我所料,您没有正确处理错误。请参阅我编辑的答案 :) 如果您仍然喜欢使用您的代码,您需要 try .. catch 您抛出的异常。
      【解决方案4】:

      验证后你需要捕获验证错误信息

      if ($validator->fails()):
              return $validator->messages()->first();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 2017-01-08
        • 1970-01-01
        • 2016-10-19
        • 2016-11-20
        • 2016-05-10
        • 1970-01-01
        相关资源
        最近更新 更多