简体   繁体   English

验证更新时遇到麻烦(Laravel 5)

[英]Having trouble validating on update (Laravel 5)

this is my update function in usercontroller 这是我在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');   
}

my UpdateUserRequest.php 我的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',            
                ];
            }

}

Each column has its own form. 每列都有自己的形式。 So updating email has its own form as does password. 因此,更新电子邮件和密码都具有其自己的形式。

When I'm updating without putting UpdateUserRequest inside my update controller, it works fine. 当我不将UpdateUserRequest放在更新控制器中而进行更新时,它可以正常工作。 But when I add that in for validations, nothing happens. 但是,当我添加它进行验证时,什么也没发生。 I get a 302 error but I don't any messages. 我收到302错误,但没有任何消息。

I tried getting msgs with validator->messages but also got nothing. 我尝试通过验证器->消息来获取消息,但一无所获。

Also if I put in 另外,如果我把

protected $redirect = '/'

I do get redirected. 我确实被重定向了。 That means validation is working right? 这意味着验证工作正常吗?

here are my routes if it helps: 这是我的路线,如果有帮助的话:

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 So I figured out how to display error messages and one of them was that 'first name and last name were required'. 更新因此,我弄清楚了如何显示错误消息,其中之一是“必须输入名字和姓氏”。 But now I get this error when I try updating 但是现在当我尝试更新时出现此错误

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

Does that mean '2' is being passed into validations? 这是否意味着将2传递给验证?

I think your validation rule will not work. 我认为您的验证规则无效。 If you update your data your validation rule also check the same row which you are updating.What I am trying to say is that suppose you are trying to update the row having id 2 , then when you doing the validation your validation rule also check the row having id 2 for uniqueness for email.Suppose you didn't update your email , then while validating your validation rule will check all row and it will not find the email unique and it should display the error. 如果您更新数据,则验证规则还将检查要更新的同一行。我想说的是假设您正在尝试更新ID为2的行,那么当您进行验证时,验证规则还将检查唯一ID为2的行表示电子邮件的唯一性。假设您没有更新电子邮件,则在验证验证规则时将检查所有行,并且找不到唯一的电子邮件,并应显示错误。

Your route must be 您的路线必须是

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

While updating your rules must check all row except the row that you are updating.You can apply the same rule to create and to update the data like this 更新规则时,必须检查除要更新的行以外的所有行。您可以应用相同的规则来创建和更新数据,如下所示

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

}

I think your update function must look something like this 我认为您的更新功能必须看起来像这样

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

A fluent way to handle this in L5.3+ is to use the Rule facade 在L5.3 +中处理此问题的一种流畅方法是使用Rule Facade

use Illuminate\Validation\Rule;

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

Note that you need to specify the validation rules as an array instead of using the | 请注意,您需要将验证规则指定为数组,而不是使用|。 character to delimit the rules. 分隔规则的字符。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM