Search code examples
laravel-5laravel-validation

Laravel 5 Multiple form validation rules


So i have three forms on one page. One is to change user's picture, another one is to update personal informations, and the last form is to set a new password. My issue here is that i'm getting validation errors on the password and password confirmation fields even though i'm trying to update some information (second form).

I have created two requests:

UserEditRequest:

class UserEditRequest extends Request
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'firstname' => 'required',
            'lastname' => 'required'
        ];       
    }
}

UserUpdatePasswordRequest:

class UserUpdatePasswordRequest extends Request
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'password' => 'required|confirmed|min:6',
            'password_confirmation' => 'required|min:6',
        ];      
    }
}

within UserController updatePassword:

public function updatePassword(UserUpdatePasswordRequest $request, $id)
{
    $user = User::findOrFail($id);
    $user->password = bcrypt($request->get('password'));
    $user->save();

    return redirect()->route('user.edit',$id)->with('success','Password changed.');
}

postEdit where I handle the personal details and avatar changes:

public function postEdit(UserEditRequest $request, $id)
{
    dd($request->all());
    $user = User::findOrFail($id);

    if($request->get('avatar'))
    {
        $destinationPath = public_path() . '/avatars/' . $user->id . '/';
        $fileName = $user->id . '.' . $request->file('avatar')->getClientOriginalExtension();
        $request->file('avatar')->move($destinationPath, $fileName);
        $user->avatar = 'avatars/' . $user->id . '/' . $fileName;
        $user->save();
        return redirect()->route('user.edit',$id)->with('success','User avatar modified.');
    }
    $user->fill($request->input())->save();

    return redirect()->route('user.edit',$id)->with('success','User details modified.');
}

quicky my routes:

Route::group(['prefix' => 'user', 'as' => 'user.'], function () {

        Route::get('profile/{userid}', ['as' => 'edit', 'uses' => 'UserController@getEdit']);
        Route::post('profile/{userid}', ['as' => 'edit', 'uses' => 'UserController@postEdit']);
        Route::post('profile/{userid}', ['as' => 'updatepassword', 'uses' => 'UserController@updatePassword']);

    });
});

Solution

  • Try to differentiate your routes for the postEdit and the updatePassword controller actions

    Route::post('profile/{userid}', ['as'=>'edit', 'uses'=>'UserController@postEdit']);  
    Route::post('profile/password/{userid}', ['as'=>updatepassword', 'uses'=>'UserController@updatePassword']);  
    

    Using the same route for two different controller actions won't work. What I mean is how do you expect the router to determine which controller action to invoke when the form action='/profile/id' method='post' ? Hence you need to differentiate the routes. Hope you got it.