【问题标题】:Multiple update methods in same controller Laravel 6同一控制器 Laravel 6 中的多种更新方法
【发布时间】:2020-04-18 12:21:36
【问题描述】:

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

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

PUT/PATCH /photos/{photo} 更新照片.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 中的每个部分编写更新函数。

【问题讨论】:

  • 所以你想有不同的方法但你希望路线是一样的?
  • 没有。已经有一个带有 url 的默认路由:users/{user}/。如果我将新路由添加到第二个更新方法,那也将具有相同的 url,因为我无法更改 url 语法。我担心的是,第二种方法的 url 是否会调用默认的更新方法。如果我太笨了请见谅
  • 因此您需要将一个字段作为部分或状态传递,例如您要在身体部位更新的部分,您可以使用此调用相同的方法和相同的路由

标签: laravel laravel-6


【解决方案1】:

不知道您为什么要使用单独的表单来更新每个字段,而您可以在一个表单中进行。但是,您可以使用 put/patch 或 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,
            ........... 
        ]);
    }

【讨论】:

  • 非常感谢。但我不明白这个概念。在文档 (laravel.com/docs/5.7/controllers#resource-controllers) 中声明更新操作应该有 url: /users/{user} 。但是您的路线网址不同(用户/{用户}/个人)。那么它是如何工作的。
  • 更新的资源路径是users/{user},但是当您定义自己的路径时,您可以根据需要进行设置。
猜你喜欢
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
相关资源
最近更新 更多