Laravel - 自定义请求中的关联数组验证

Posted

技术标签:

【中文标题】Laravel - 自定义请求中的关联数组验证【英文标题】:Laravel - associative Array validation in a custom request 【发布时间】:2017-06-01 09:10:30 【问题描述】:

我有一个客户要求如下:

<textarea name="intro[en]"></textarea>
<textarea name="intro[fr]"></textarea>
<textarea name="intro[de]"></textarea>

我正在使用自定义请求对其进行验证:

class UpdateProfileRequest extends Request

    public function authorize()
    
        return true;
    

    public function rules()
    
         return [
             'intro.*'           => 'required|max:100'
         ];
    

验证器不工作。我认为这是因为 .* 仅适用于编号数组,而不适用于关联数组?

我不知道该怎么做。

有没有办法通过这样的自定义请求来做到这一点?如果是,语法是什么?

否则,我该怎么办。我已经在控制器方法中编写了一些自定义代码,如下所示:

    $hasIntro = false;
    $hasBio = false;

    foreach($request->get('intro') as $language => $localIntro)
    
        if(!empty($request->get('intro')[$language]))
        
            $hasIntro = true;
        
    

    if(!$hasIntro or !$hasBio)
    
        return redirect()->back()->withErrors('You must enter at least 1 Bio and 1 Intro');
    

我认为这可能是解决此问题的一种手动方式。虽然我相信 withErrors 需要一个验证器,所以我又回到了同样的问题......虽然也许有办法手动做到这一点?

我理想的解决方案是找到关联数组语法,如果确实存在的话?

【问题讨论】:

在规则中使用 foreach 循环 【参考方案1】:

我不确定正确的方法 但我的想法是这样的

public function rules($inputs)

    $rules = [];
    foreach ($inputs as $key => $val) 
        if ( strpos($key, "intro") === 0 )
            $rules[$key] = 'required|max:100';
        
    
    return $rules;

【讨论】:

【参考方案2】:
class UpdateProfileRequest extends Request
    
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        
            return true;
        

        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        
            return [
                'intro.*'               => 'required|max:100'
            ];
        


        /**
         * @param Validator $validator
         *
         * @return mixed
         */
        protected function formatErrors(Validator $validator)
        
            return $validator->errors()->all();
        
    

您有以下相同的名称,因此请确保它不同或删除一个,更改名称。

<textarea name="intro[fr]"></textarea>
<textarea name="intro[fr]"></textarea>

【讨论】:

这和我发的差不多?【参考方案3】:
public function rules()

        $rules = [];

        $intro = $this->request->get('intro');

        if (!empty($intro)) 
            foreach ($intro as $index => $doc) 
                $rules[sprintf('intro.%d', $index)] = 'required|max:100';
            
        

        return $rules;
    

【讨论】:

以上是关于Laravel - 自定义请求中的关联数组验证的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3 自定义验证消息数组

使用带有附加参数的自定义规则验证 Laravel 中的数组

如何使用从 laravel 中的数组中获取的各种术语进行 mysql 关联查询

我可以通过 Laravel 5.1 中的自定义请求对象验证后恢复输入字段值吗?

在一个查询中使用具有多个关联数组的 laravel eloquent 获取数据

为啥客户凭证应该与 Laravel Passport 中的用户相关联?