我一直在网上和laravel文档中搜索,试图让它工作。
理想情况下,我可以只使用$request->validate()方法。但我也尝试过手工制作和报告错误(这让我更接近了一点,但仍然不能在我需要它的地方工作)。
我的情况是这样的。
有人创建了一个帖子。他们创建了一个标题,我根据这个标题生成了一个slug。
标题必须是唯一的。这是预期的工作。我总是得到一个很好的错误消息,标题必须是唯一的。
蛞蝓也必须是唯一的。如果有人将一个帖子命名为hello
,然后将另一个帖子命名为hello!
,这可能是一个问题
<form ...>
<input type="text" name="title" id="title">
</form>
他们提交了,在我的控制器方法中,在我做任何验证之前,我添加了段符到请求中
$request->slug = Str::slug($request->title);
然后我尝试验证
$request->validate([
'title' => 'required|unique:posts',
'slug' => 'unique:posts,slug'
]);
在Post-1
和Post 1
或hello
和hello!
等情况下,我希望对段塞的验证失败,就像对标题的验证一样。
但是,它没有,然后我得到一个SQL错误
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'post-1' for key 'posts.posts_slug_unique'
我得到它与Validator::make
工作…但只有存储方法。它仍然无法进行更新。而且,它也不是那么干净。
有人看到我做错了什么吗?
@uz4ir已经为我修复了。
这可能不是最佳实践解决方案,但是有计划在将来向表单添加自定义的段塞输入。因此,这段代码将在将来被删除。
我看到的其他解决方案似乎要花费更多的精力,而且我看不出在此时将slug添加到请求中有什么害处。
改变$request->slug = Str::slug($request->title);
$request->request->add(['slug' => Str::slug($request->title)]);
伟大工作。