在 Laravel 中包含自定义表单请求会阻止控制器正常工作

Including a custom form request in Laravel prevents the controller from working correct

描述

我有一个 user/role 管理系统,希望管理员能够更改用户的密码和名称。 到目前为止,它在 UsersController:

中使用此代码
     public function update(request $request, User $user)
  {

    // dd($request);
    //Save roles
    $user->roles()->sync($request->roles);

    //Save user

    $user->name = $request->input("name");
    if ($request->input('password')) {
      $user->password = Hash::make($request->input('password'));
    }
    $user->save();

    return redirect()->route("admin.users.index");
  }

我使用此命令 php artisan make:request UpdateUser 创建了一个名为 UpdateUser 的表单请求,并使用 use App\Http\Requests\UpdateUser; 将其放入 UsersController 并将 public function update(request $request, User $user)... 更改为 public function update(UpdateUser $request, User $user)...

(我从 this site 那里得到了这方面的教程)

UpdateUser 看起来像这样,基本功能应该是验证密码输入和密码确认输入是否匹配。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdateUser extends FormRequest
{
  /**
   * Determine if the user is authorized to make this request.
   *
   * @return bool
   */
  public function authorize()
  {
    return true;
  }

  /**
   * Get the validation rules that apply to the request.
   *
   * @return array
   */
  public function rules()
  {
    return [
      'name' => ['string', 'max:255', "unique:users"],
      'password' => ["nullable", 'string', 'min:6', 'confirmed'],
      'roles' => ['exists:roles,id'],
    ];
  }
}

问题

没有 UpdateUser 就可以了。我可以更改名称、密码和角色。 但是 UpdateUser 我只能更改名称。无法更改角色或密码。当我尝试更改角色 and/or 密码并提交时,只会重新加载编辑页面。

那么这可能是什么原因呢?

你可以找到我的整个 repo here

改用$request->input('password')

我建议您也对所有请求数据使用 ->input 方法。

当您使用自定义请求时,您应该使用 $request->password 而不是 $request['password']。这是我看到的第一件事。

事实证明,在大多数情况下,这是用户的错误;)

所以发生了什么?

在编辑中 blade 我从用户加载名称,我想编辑。

{{Form::text("name", $user->name,  ["class" => "edit-input", "placeholder" => "Neuer Name..."])}}

当我只更改了角色或密码 而没有 更改名称时,UpdateUser 声称用户已经存在。这是来自 UpdateUser 的相应代码行:

public function rules()
  {
    return [
      'name' => ['string', 'max:255', "unique:users"],
      'password' => ["nullable", 'string', 'min:6', 'confirmed'],
      'roles' => ['exists:roles,id'],
    ];
  }
}

unique:users 要求导致编辑页面的简单重新加载,因为该名称显然已经存在。 我现在明白了,因为我实现了显示 error/success 通知。

在编辑 blade 中,我只是将 $user->name 替换为 ""