【问题标题】:Why isn't this unique Laravel validation working?为什么这种独特的 Laravel 验证不起作用?
【发布时间】:2021-11-28 20:46:30
【问题描述】:

我一直在搜索互联网和 laravel 文档,试图让它发挥作用。

理想情况下,我可以只使用 $request->validate() 方法。但我也尝试过手动生成和报告错误(这让我更接近了一点,但仍然无法在我需要的任何地方工作)。

这是我的情况。

有人创建了一个帖子。他们创建一个标题,我根据该标题生成一个 slug。

标题必须是唯一的。这按预期工作。我总是收到一条很好的错误消息,提示标题必须是唯一的。

蛞蝓也必须是独一无二的。如果有人将帖子命名为 hello,然后将另一个帖子命名为 hello!,这可能会出现问题

<form ...>
  <input type="text" name="title" id="title">
</form>

所以他们提交,并在我的控制器方法中,在我进行任何验证之前,我将 slug 添加到请求中。

$request->slug = Str::slug($request->title);

然后我尝试验证

$request->validate([
  'title' => 'required|unique:posts',
  'slug' => 'unique:posts,slug'
]);

Post-1Post 1hellohello! 这样的情况下,我预计slug 的验证会像标题一样失败。

但是,它没有,然后我得到一个 SQL 错误

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'post-1' for key 'posts.posts_slug_unique'

我让它与Validator::make 一起工作...但仅适用于 store 方法。它仍然无法进行更新。此外,它几乎没有那么干净。

有人看到我做错了吗?

【问题讨论】:

  • 在 Laravel 中向请求对象添加东西通常被认为是一种反模式。无论如何,如果你真的必须这样做,正确的方法是$request-&gt;request-&gt;add(['slug', Str::slug($request-&gt;title)]);
  • 如果我想验证那个 slug(即使它不是请求的一部分),你建议什么作为最佳实践?如果我能以更好的方式做到这一点,那我更愿意。
  • 实际上,我现在有几个想法可以更好地做到这一点。谢谢!

标签: php laravel validation unique


【解决方案1】:

@uz4ir 为我解决了问题。

这可能不是最佳实践解决方案,但我们计划在未来向表单添加自定义 slug 输入。所以以后会去掉这段代码。

我查看的其他解决方案似乎要付出更多努力,目前我看不出向请求中添加 slug 有什么害处。

变化

$request->slug = Str::slug($request->title);

$request->request->add(['slug' => Str::slug($request->title)]);

效果很好。

【讨论】:

    猜你喜欢
    • 2018-11-26
    • 2014-11-29
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2016-08-24
    • 2017-07-03
    • 2020-04-02
    相关资源
    最近更新 更多