在更新时验证有问题(Laravel 5)


Having trouble validating on update (Laravel 5)

这是我在usercontroller中的更新函数

public function update_user_credentials(UpdateUserRequest $request)
{ 
    $user = User::find($request->user()->id);
    if(!$user) 
    {
        return response('User not found', 404);
    }
    try
    {
        $data=Input::all();
        $user->fill($data);
        var_dump($user);
        exit;
        $user->save();
    } 
        catch(Exception $ex)
    {
        return response($ex->getMessage(),400);
        echo Success::get('message');
    } 
    return Redirect::back()->with('message','updated');   
}
我UpdateUserRequest.php

<?php
namespace App'Http'Requests;
use App'Http'Requests'Request;
class UpdateUserRequest 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 [
                'first_name' =>'required',
                'last_name'=>'required',
                'url'=>'url',
                'password'=>'min:6|confirmed',
                'password_confirmation'=>'min:6',
                'email'=>'email|unique:users,email',            
                ];
            }
}

每一列都有自己的表单。所以更新邮件和密码都有自己的形式。

当我更新没有把UpdateUserRequest在我的更新控制器,它工作得很好。但是当我为验证添加那个时,什么都没有发生。我得到一个302错误,但我没有任何消息。

我尝试使用validator->消息获取msgs,但也一无所获。

如果我输入

protected $redirect = '/'

我确实被重定向了。这意味着验证是有效的,对吗?

如果有帮助,这里是我的路线:

Route::get('/account/email',function(){
    $user=Request::user();
    $id = $user->id;
    return Response::view('user.edit.email', compact('user'));
});
Route::patch('/account/update','UserController@update_user_info');

Update所以我想出了如何显示错误消息,其中一个是'需要姓和名'。但是现在当我尝试更新

时出现了这个错误
ErrorException in UserController.php line 93:
Missing argument 2 for App'Http'Controllers'UserController::update_user_credentials()
in UserController.php line 93
at HandleExceptions->handleError('2', 'Missing argument 2 for App'Http'Controllers'UserController::update_user_credentials()', '/Users/Jack/projects/makersBrand/laravel/app/Http/Controllers/UserController.php', '93', array('request' => object(UpdateUserRequest))) in UserController.php line 93
at UserController->update_user_credentials(object(UpdateUserRequest))
at call_user_func_array(array(object(UserController), 'update_user_credentials'), array(object(UpdateUserRequest))) in Controller.php line 256
at Controller->callAction('update_user_credentials', array(object(UpdateUserRequest))) in ControllerDispatcher.php line 164
at ControllerDispatcher->call(object(UserController), object(Route), 'update_user_credentials') in ControllerDispatcher.php line 112
at ControllerDispatcher->Illuminate'Routing'{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate'Pipeline'{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in ControllerDispatcher.php line 114
at ControllerDispatcher->callWithinStack(object(UserController), object(Route), object(Request), 'update_user_credentials') in ControllerDispatcher.php line 69
at ControllerDispatcher->dispatch(object(Route), object(Request), 'App'Http'Controllers'UserController', 'update_user_credentials') in Route.php line 201
at Route->runWithCustomDispatcher(object(Request)) in Route.php line 134
at Route->run(object(Request)) in Router.php line 704
at Router->Illuminate'Routing'{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate'Pipeline'{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in Router.php line 706
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 671
at Router->dispatchToRoute(object(Request)) in Router.php line 631
at Router->dispatch(object(Request)) in Kernel.php line 236
at Kernel->Illuminate'Foundation'Http'{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate'Pipeline'{closure}(object(Request)) in VerifyCsrfToken.php line 50
at VerifyCsrfToken->handle(object(Request), object(Closure))
at call_user_func_array(array(object(VerifyCsrfToken), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate'Pipeline'{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(ShareErrorsFromSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate'Pipeline'{closure}(object(Request)) in StartSession.php line 62
at StartSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(StartSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate'Pipeline'{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure))
at call_user_func_array(array(object(AddQueuedCookiesToResponse), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate'Pipeline'{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure))
at call_user_func_array(array(object(EncryptCookies), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate'Pipeline'{closure}(object(Request)) in CheckForMaintenanceMode.php line 42
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate'Pipeline'{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in Kernel.php line 122
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 87
at Kernel->handle(object(Request)) in index.php line 54

这是否意味着'2'正在被传递到验证中?

我认为您的验证规则将不起作用。如果更新数据,验证规则也会检查正在更新的同一行。我想说的是,假设您正在尝试更新具有id 2的行,那么当您进行验证时,您的验证规则也检查具有id 2的行,以确保电子邮件的唯一性。假设您没有更新您的电子邮件,那么当验证您的验证规则将检查所有行,它不会发现电子邮件唯一,它应该显示错误。

你的路由必须是

Route::post('/account/update/{id}','UserController@update_user_info');

更新规则时必须检查除要更新的行以外的所有行。您可以应用相同的规则来创建和更新数据,如下所示

public function rules(){
return [
     'first_name' =>'required',
     'last_name'=>'required',
     'url'=>'url',
     'password'=>'min:6|confirmed',
     'password_confirmation'=>'min:6',
     // you need to change here 
     'email'=>'email|unique:users,email,'.$this->route()->getParameter('id').',database_id'            
];
// database_id means your table primary key column i.e id
}

我想你的更新函数应该是这样的

public function update_user_credentials(Requests'UpdateUserRequest $request,$id){
// code
}

在L5.3+中处理这个问题的一个流畅的方法是使用Rule facade

use Illuminate'Validation'Rule;
Validator::make($data, [
    'email' => [
    'required',
    Rule::unique('users')->ignore($user->id),
  ],
]);

请注意,您需要将验证规则指定为数组,而不是使用|字符来分隔规则。