【发布时间】:2015-06-14 19:06:39
【问题描述】:
我正在寻找一种更简洁的方法来在存储帖子时验证标签。
所有输入验证都在我的自定义请求StorePostRequest 中进行。问题是我需要检查数据库中是否存在给定的标签,只允许现有的标签。函数$request->input('tags')返回一个以逗号分隔的字符串,例如:Tag1,Tag2,Tag3。
代码如下:
/**
* Store a newly created resource in storage.
*
* @param StorePostRequest $request
* @return Response
*/
public function store(StorePostRequest $request)
{
//THIS PIECE OF CODE
$tags = explode(',', $request->input('tags'));
$tags = Tag::whereIn('title', $tags)->lists('id');
if(count($tags) < 1)
{
return redirect()->back()->withInput()->withErrors([ trans('tags.min') ]);
}
else if(count($tags) > 5)
{
return redirect()->back()->withInput()->withErrors([ trans('tags.max') ]);
}
//TILL HERE
$post = $request->user()->posts()->create([
'slug' => unique_slug('Post', $request->input('title')),
'title' => $request->input('title'),
'description' => $request->input('description'),
'summary' => $request->input('summary'),
]);
$post->tags()->attach($tags);
return redirect(route('theme.post.show', [$theme->slug, $post->slug]))->with(['success', trans('messages.post.store')]);
}
在多个控制器中使用时,代码有点草率和冗余。
为了解决这个问题,我创建了一个ValidationServiceProvider 来扩展核心验证器规则。像这样的:
$this->app['validator']->extend('tags', function ($attribute, $value, $parameters)
{
$tags = explode(',', $value);
$tags = Tag::whereIn('title', $tags)->lists('id');
if(count($tags) < 1 || count($tags) > 5))
{
return false;
}
});
相当整洁。问题是我仍然需要能够访问控制器中的$tags 变量(因为->attach($tags))。
有没有更好的方法来解决这个问题?还是我应该停止思考,只使用(并重复)我拥有的代码?
提前致谢,希望能有所帮助。
【问题讨论】:
-
您可以创建一个
TagsTransformer类来处理从字符串到数组的转换,并在控制器和验证器上使用它。 -
是的,非常好。我现在在我的控制器中有一个名为
processTags()的私有函数,它执行标签的转换和验证。已经好多了。
标签: php validation laravel customization laravel-5