同一控制器中的多种更新方法 Laravel 6

Multiple update methods in same controller Laravel 6

我目前正在尝试构建一个带有编辑字段的用户注册系统。在编辑部分,我必须为 editing/updating 个人详细信息、电子邮件和密码创建单独的视图。

我从一个空的资源控制器开始。它只有一种编辑方法。因此我添加了额外的编辑方法。每个方法都可以有一个单独的路由。但是,我很难为每个部分中的每个更新方法设置单独的路由,因为资源在文档中只有一个这样的路由:

PUT/PATCH /photos/{photo} update photos.update

有什么解决方法吗?

控制器

class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware(['auth', 'verified']);
    }

    public function index()
    {
        return view('users.index');
    }

    public function edit_personal(User $user)
    {
        $user_profile = User::find($user->id);

        return view('users.edit.personal', ['users' => $user_profile]);
    }

    public function update_personal(Request $request, User $user)
    {
        // How to write route for this method.
    }

    public function edit_email(User $user)
    {
        $user_profile = User::find($user->id);

        return view('users.edit.email', ['users' => $user_profile]);
    }

    public function update_email(Request $request, User $user)
    {
        // How to write route for this method.
    }

    public function edit_password(User $user)
    {
        $user_profile = User::find($user->id);

        return view('users.edit.password', ['users' => $user_profile]);
    }
}

路线

Auth::routes(['verify' => true]);
Route::get('/', function () {
    return view('welcome');
});
Route::get('/users/{user}/personal', 'UserController@edit_personal')->name('users.personal');
Route::get('/users/{user}/email', 'UserController@edit_email')->name('users.email');
Route::get('/users/{user}/password', 'UserController@edit_password')->name('users.password');
Route::resource('users', 'UserController');

基本上我将用户控制器的编辑部分分为个人、电子邮件和密码部分,它们有单独的形式。我想为 UserController 中的每个部分编写更新函数。

不知道您为什么要使用单独的表单来更新每个字段,而您可以在一个表单中进行更新。但是您可以使用 put/patch 或 post 方法进行更新。例如,我在这里使用 post。 路线:

Route::get('users/{user}/personal', 'UserController@edit_personal')->name('users.personal');
Route::post('users/{user}/personal', 'UserController@update_personal')->name('users.update-personal');
Route::get('users/{user}/email', 'UserController@edit_email')->name('users.email');
Route::post('users/{user}/email', 'UserController@update_email')->name('users.update-email');
Route::get('users/{user}/password', 'UserController@edit_password')->name('users.password');
Route::post('users/{user}/password', 'UserController@update_password')->name('users.update-password');

由于您使用的是路由模型绑定,因此您可以直接获取对象。

public function edit_personal(User $user)
    {
        return view('users.edit.personal', ['users' => $user]);
    }

public function update_personal(Request $request, User $user)
    {
        //validation goes here
        $user->update([
            'value' => $request->value,
            ........... 
        ]);
    }