Laravel 5验证无法捕获错误

时间:2015-05-25 13:20:04

标签: validation laravel laravel-5

我太过于想弄清楚如何正确追踪这一点,所以希望有人可以帮助我。

验证器不再适用于我的Laravel 5应用程序。它没有发现错误。一切都过去了。我缩小了我的代码,以便我做一个简单的模具并在表单提交时转储验证器,如下所示:

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

注册商验证方法是:

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服务提供商设置的自定义验证)。

现在,如果我提交一个填错的表单,我会返回一个Validator对象,其中定义了所有规则,但是一个空的#failedRules数组,如果我死了并转储$ request,则没有错误包。< / p>

如果我死了并转储$ validtor-&gt; failed(),它返回true,但是当我尝试使用$ validator-&gt; 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( '/' );
}

首次实施时,一切正常。所以,显然我在过去几天里对应用程序的其他部分做了一些改变。当然,我已经测试了我能想到的一切(根据我所做的改变),但似乎没有任何差别。

这是否与加载类的顺序有关?我在这里错过了什么?我确信这是显而易见的,但我真的可以使用一些建议。提前谢谢。

4 个答案:

答案 0 :(得分:1)

你应该有像

这样的东西
array('required', 'regex:...')

而不是

array('required, regex...')

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

答案 1 :(得分:0)

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

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

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( '/' );
}

答案 2 :(得分:0)

验证后,您需要捕获验证错误消息

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

答案 3 :(得分:0)

感谢大家的帮助!对于将来遇到这种情况的任何人来说,事实证明将正则表达式规则放在一个数组中,正如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在他们的回答中钉了这个。我没有在第一时间正确设置阵列。