同一控制器中的多种更新方法 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,
...........
]);
}
我目前正在尝试构建一个带有编辑字段的用户注册系统。在编辑部分,我必须为 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,
...........
]);
}