【问题标题】:Laravel - associative Array validation in a custom requestLaravel - 自定义请求中的关联数组验证
【发布时间】: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 循环

标签: php arrays laravel validation laravel-5.2


【解决方案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;
        }
    

    【讨论】:

      猜你喜欢
      • 2017-05-30
      • 2017-12-06
      • 2016-06-15
      • 2017-11-17
      • 2019-10-07
      • 1970-01-01
      • 2021-02-15
      • 2020-12-10
      • 2019-11-27
      相关资源
      最近更新 更多