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

时间:2017-01-17 10:37:34

标签: php arrays laravel validation laravel-5.2

我的客户要求如下:

<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需要验证器,所以我回到了同样的问题......虽然也许有办法手动完成这个?

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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;
    }

答案 2 :(得分:0)

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>