【发布时间】: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-1 和Post 1 或hello 和hello! 这样的情况下,我预计slug 的验证会像标题一样失败。
但是,它没有,然后我得到一个 SQL 错误
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'post-1' for key 'posts.posts_slug_unique'
我让它与Validator::make 一起工作...但仅适用于 store 方法。它仍然无法进行更新。此外,它几乎没有那么干净。
有人看到我做错了吗?
【问题讨论】:
-
在 Laravel 中向请求对象添加东西通常被认为是一种反模式。无论如何,如果你真的必须这样做,正确的方法是
$request->request->add(['slug', Str::slug($request->title)]); -
如果我想验证那个 slug(即使它不是请求的一部分),你建议什么作为最佳实践?如果我能以更好的方式做到这一点,那我更愿意。
-
实际上,我现在有几个想法可以更好地做到这一点。谢谢!
标签: php laravel validation unique