Не могу обновить информацию о пользователе в Laravel - PullRequest
0 голосов
/ 11 сентября 2018

В моем текущем проекте (система управления школой) я хочу дать администраторам возможность регистрировать пользователей. Например, администраторы могут создавать курсы и предметы, что мне удалось сделать с помощью контроллеров ресурсов. Тем не менее, я думал, что смогу сделать то же самое для пользователей, поскольку процесс кажется мне тем же. То есть: я могу показывать, редактировать, создавать, обновлять и удалять пользователей.

Однако до сих пор я столкнулся с несколькими проблемами. Прямо сейчас я могу создавать пользователей, но не обновлять их.

Вот мой код:

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',
  ]);

});

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, поэтому я немного растерялся.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Если запрос не выполняется, когда пользователь пытается обновить свою информацию без изменения адреса электронной почты, вам потребуется дополнительная логика, чтобы игнорировать идентификатор пользователя, связанного с электронной почтой.

Иногда вы можете игнорировать данный идентификатор во время уникальной проверки. Например, рассмотрим экран «Обновить профиль», который включает имя пользователя, адрес электронной почты и местоположение. Конечно, вы хотите убедиться, что адрес электронной почты является уникальным. Однако, если пользователь изменяет только поле имени, а не поле электронной почты, вы не хотите, чтобы выдавалась ошибка проверки, поскольку пользователь уже является владельцем адреса электронной почты.

Чтобы поручить валидатору игнорировать идентификатор пользователя, мы будем использовать класс 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',
);
0 голосов
/ 11 сентября 2018

Вы должны исключить идентификатор пользователя ($ id) при проверке электронной почты, поскольку вы используете "уникальное" правило.

вы можете проверить руководство здесь https://laravel.com/docs/5.6/validation#rule-unique

...