Laravel 5现有标签的自定义验证规则

问题描述 投票:0回答:2

我正在寻找一种更清洁的方式来存储帖子时验证标签。

所有输入验证都在我的自定义请求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))。

有没有更好的方法来解决这个问题?或者我应该停止思考并使用(并重复)我的代码?

在此先感谢,希望它有一定道理。

php validation laravel customization laravel-5
2个回答
0
投票

我假设你理解这个类的用法,因为我已经看到你已经定义了StorePostRequest类。所以,只是为了澄清,rules方法可能看起来像:

public function rules()
{
    return [
        'tags' => ['required', 'tags'] //kb
    ];
}

最后,如果所有工具都在正确的位置,您只需操作控制器中的数据,如下所示:

public function store(StorePostRequest $request)
{
    // at this point, the tags are already validated, so we, proceed get them:
    $tags = explode(',', $$request->get('tags'));

    $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')]);
}

请记住,在控制器的功能中使用StorePostRequeststore,它已经在验证并运行规则。

如果您确实正确定义了StorePostRequest的规则,那就足够了。


0
投票
foreach($request->tags as $k=>$tags){
            $this->validate($request, [
                'tags.'.$k => 'required|string|max:20'
            ]);
        }
© www.soinside.com 2019 - 2024. All rights reserved.