【问题标题】:Unique fields in form requests when editing in Laravel 5在 Laravel 5 中编辑时表单请求中的唯一字段
【发布时间】:2016-06-12 15:59:04
【问题描述】:

我正在寻找在 Laravel 表单请求中强制执行唯一字段的最佳方法,编辑时除外。最明显的例子是只允许使用一次电子邮件地址,即系统中的每个用户都需要一个唯一的电子邮件地址。

通过使字段唯一,可以直接使用表单请求来实现:

public function rules()
{
    return [
        'email' => ['required', 'email', 'unique:users,email'],
    ];
}

这使得该字段成为必填字段,作为电子邮件进行验证,并使其在用户表中唯一。非常适合创建新用户。但是编辑呢?用户想要编辑他们的个人资料并再次保存相同的电子邮件地址是完全合理的(这是完全有效的)。但是,unique 规则当然会触发,因为电子邮件已经“使用中”(尽管用户试图自己编辑)。

Laravel 提供了一种解决方法,通过传入 user 表的 ID 来忽略:

'email' => ['required', 'email', 'unique:users,email,'.$userId]

但是如何获取用户ID?也许这是一个不好的例子,因为获取登录的用户 ID 很简单,但是其他没有存储在会话中的对象呢?

如果使用的是 REST,那么对象的 ID 将在 URL 中,并且可以通过路由获得:

$userId = $this->route('order');

但这似乎很脏。还有其他不使用 REST 修改对象的实例呢?在 Laravel 5 中编辑对象时,你们如何强制表单请求的唯一性?

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    如果需要,您可以有 2 个具有不同规则的表单请求。我认为从 FormRequest 中提取信息来调整规则并不肮脏,因为 FormRequest 是一个请求,您可能需要其中一些信息来决定如何进行验证或授权。

    我有一篇关于使用 FormRequest 进行创建和更新的帖子,使用规则中的唯一规则,该规则使用路由参数附加到唯一规则。 asklagbox - blog - Form Request for Store and Update

    因为它使用 HTTP 方法来知道它是用于存储还是更新,并在发生更新时附加到唯一规则(Rest)。如果您不使用 REST,您仍然可以执行此操作,您只需要检查 HTTP 方法之外的其他内容,以了解这是用于存储还是更新。如果需要,您可以调整此方法以检查输入值而不是路由参数以附加到唯一规则。由于 FormRequest 非常特定于资源,您实际上不需要发疯并考虑您想要做某事的每一种可能的其他方式,否则您的应用/API 可能会开始变得不一致。

    // added to base FormRequest
    
    protected $updateMethods = ['PUT', 'PATCH'];
    
    protected function appendUnique($key, $keyName = 'id')
    {
        if (in_array($this->method(), $this->updateMethods) && $param = $this->route($key)) {
            if ($param instanceof Model) {
                $rt = "{$param->getKey()},{$param->getKeyName()}";
            } else {
                $rt = "{$param},{$keyName}";
            }
            return ','. $rt;
        }
    }
    

    那么你的 FormRequest 的 rules 方法中的数组会是这样的:

    'email' => 'required|unique:users,email'. $this->appendUnique('user'),
    

    我经常使用 Route Model Bindings(隐式和显式),这就是为什么这样设置的原因,而且我检查的资源很少通过输入而不是路由参数传递。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-03-08
      • 2018-12-25
      • 2020-11-12
      • 2018-12-02
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多