【问题标题】:Can't update user information in Laravel无法在 Laravel 中更新用户信息
【发布时间】:2018-09-10 23:57:46
【问题描述】:

在我当前的项目(学校管理系统)中,我想让管理员能够注册用户。例如,管理员可以创建课程和科目,我已经使用资源控制器设法做到了。但是,我认为我可以为用户做同样的事情,因为这个过程对我来说是一样的。即:我可以显示、编辑、创建、更新和删除用户。

但是,到目前为止,我遇到了几个问题。现在我可以创建用户,但不能更新他们。

这是我的代码:

web.php

Route::middleware(['auth', 'admin'])->group(function () {

  Route::get('/admin', 'HomeController@admin');

  Route::post('register', 'UserController@store');

  Route::resources([
      'admin/cursos' => 'CursoController',
      'admin/turmas' => 'TurmaController',
      'admin/semestres' => 'SemestreController',
      'admin/materias' => 'MateriaController',
      'admin/usuarios' => 'UserController',
  ]);

});

用户控制器.php

public function update(Request $request, $id)
{
  $rules = array(
    'name'      => 'required|string|max:255',
    'email'     => 'required|string|email|max:255|unique:users',
    'role'      => 'required|string',
    'password'  => 'required|string|min:6|confirmed',
  );

  $validator = validator::make(Input::all(), $rules);

  if ($validator->fails()) {
    // return dd();
    return Redirect::to('/admin/usuarios/' . $id . '/edit')
    ->withErrors($validator);
  } else {
    // store
    $user = User::find($id);
    $user->name       = Input::get('name');
    $user->email      = Input::get('email');
    $user->role       = Input::get('role');
    $user->password   = Input::get('password');
    $user->save();

    // redirect
    Session::flash('message', 'Sucesso!');
    return Redirect::to('/admin/usuarios');
  }

}

每次我尝试更新用户信息时验证都会失败。这里到底发生了什么?我对 Laravel 比较陌生,所以我现在有点迷茫。

【问题讨论】:

  • Validation fails - 究竟如何?什么失败了,消息是什么?据我们所知,您可能在更新表单上将name 留空,因此验证正确失败。这里没有足够的信息来提供帮助而无需猜测......

标签: laravel crud


【解决方案1】:

如果在用户尝试更新他们的信息而不更改电子邮件地址时请求失败,您需要额外的逻辑来忽略与电子邮件关联的用户的 ID。

有时,您可能希望在唯一检查期间忽略给定的 ID。例如,考虑一个包含用户名、电子邮件地址和位置的“更新配置文件”屏幕。当然,您需要验证电子邮件地址是否唯一。但是,如果用户只更改名称字段而不更改电子邮件字段,则您不希望引发验证错误,因为用户已经是电子邮件地址的所有者。

为了指示验证器忽略用户 ID,我们将使用 Rule 类来流畅地定义规则。在这个例子中,我们还将验证规则指定为一个数组,而不是使用 |用于分隔规则的字符:

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

应用于您的一组验证规则,它看起来像:

$rules = array(
    'name'      => 'required|string|max:255',
    'email'     => [
        'required', 
        'string', 
        'email, 
        'max:255', 
        Rule::unique('users')->ignore(auth()->id())
     ],
    'role'      => 'required|string',
    'password'  => 'required|string|min:6|confirmed',
);

【讨论】:

    【解决方案2】:

    您必须在电子邮件验证中排除用户 ID ($id),因为您使用“唯一”规则。

    您可以在此处查看指南 https://laravel.com/docs/5.6/validation#rule-unique

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      相关资源
      最近更新 更多