自定义请求不在表单验证成功时调用控制器方法

时间:2016-02-11 20:01:01

标签: validation laravel-5 routes laravel-5.1

我试图在Laravel 5上使用自定义请求来验证通过post发送的输入,但是当表单字段正常时,即。表单验证没问题,我的控制器方法没有被调用。那是一个错误吗?怎么了?我知道这是可能的,因为我曾经在另一个项目中做过这个。我在这个项目中使用的是5.2.6版本,然后我认为这是一个特定版本的问题,当我转回"到5.1但编辑我的composer.json,删除vendor文件夹,然后使用composer install重新安装。

我的UserController的内容:

//...
public function save(Requests\CreateUserRequest $request)
{
    $user = new User();

    $user->name = $request->input('name');
    $user->email = $request->input('email');
    $user->username = $request->input('username');
    $user->password = $request->input('password_confirmation');
    //$user->profile_id = $request->input('profile');
    $user->profile_id = 1;

    $user->save();

    return redirect()->route('get_user_read');
}
//...

CreateUserRequest:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CreateUserRequest 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 [
        'profile' => 'required',
        'name'    => 'required',
        'username'   => 'required|unique:users,username',
        'email' => 'required|email|unique:users,email',
        'password' => 'required',
        'password_confirmation'   => 'required|same:password',
    ];
}

public function messages()
{
    return [
        'profile.required' => 'O campo perfil é obrigatório!',
        'name.required' => 'O campo nome é obrigatório!',
        'username.required' => 'O campo nome de usuário é obrigatório!',
        'username.unique' => 'O nome de usuário já foi registrado!',
        'email.required' => 'O campo email é obrigatório!',
        'email.unique' => 'O email informado já foi registrado!',
        'email.email' => 'O email informado não é válido!',
        'password.required' => 'O campo senha é obrigatório!',
        'password_confirmation.required' => 'O campo de confirmação de senha é obrigatório!',
        'password_confirmation.same' => 'A confirmação de senha não confere com a senha informada!',
    ];
}
}

感谢。

1 个答案:

答案 0 :(得分:0)

自Laravel 5.2以来,有一些名为Middleware Groups的功能。

由于FAILED验证没有显示任何错误,它似乎会将您重定向回您的表单。在会话中启用共享之前,您不会看到任何错误。

要显示错误,请确保已启用\Illuminate\View\Middleware\ShareErrorsFromSession::class中间件。默认情况下,它包含在“web”中间件组中。

要解决您的问题,您只需创建路由组并将中间件组设置为“web”,如下所示:

Route::group(['middleware' => ['web']], function () {
    // Here comes your routes
});

请看一下:Laravel 5.2 validation errors

另外,请确保表单中包含刀片错误标记,如下所示:

{!! Form::text('profile') !!}
@if ($errors->has('profile'))<p style="color:red;">{!!$errors->first('profile')!!}</p>@endif
{!! Form::text('name') !!}
@if ($errors->has('name'))<p style="color:red;">{!!$errors->first('name')!!}</p>@endif

或者你可以显示所有这些:

@if($errors->any())
    <div style="color:red;">
        @foreach($errors->all() as $error)
            <p>{{$error}}</p>
        @endforeach
    </div>
@endif

此外,您不能使用public function messages()方法并使用resources/lang/pt/validation.php文件为您的语言定义所有消息。