动态表单请求验证(Laravel)

5

在我的函数中创建动态的FormRequest验证是否可行?请参考以下示例代码。

public function store(Request $request)
{
    Model::create($request->all());
    return redirect(url('/'));
}

我的意思是将“Request”参数更改为变量$formRequest。
我的目标是为单个模型的动态数据集创建不同的验证规则。
如果我可以用其他方法实现这个目标,请告诉我。谢谢!
编辑:
示例场景: 我有一个表单,包含名字、中间名和姓氏字段。
第一条规则:
public function rules()
{
    return [
    'firstname' => 'required',
    'middlename' => 'required',
    'lastname' => 'required'
    ];
}

第二条规则:
public function rules()
{
    return [
    'firstname' => 'required',
    'lastname' => 'required'
    ];
}

第二个规则只需要名字和姓氏。

我想知道是否有其他方法可以做到这一点,而不是创建多个存储方法并添加更多路由。

4个回答

3
跳过使用FormRequest,直接在$request实例上使用validate方法即可实现此功能。甚至Laracasts都有一堂课程讲解此方法。
public function store(Request $request) {
    $rules = [/*...*/];

    $attributes = $request->validate($rules);

    Model::create($attributes);

    return redirect(url('/'));
}

这是我想的,但如果可能的话,我想只使用一个函数。 - alvirbismonte
我重写了答案,使用$request->validate代替。这可能更适合你。 - Marwelln
将您的建议与@Sletheren的建议结合起来,给了我一个想法。非常感谢你们两个。 - alvirbismonte

1
您可以创建自定义请求:
php artisan make:request CustomRequest

这将生成这个类:
class CustomRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}
authorize()方法将确定是否可以首先验证请求。 rules()方法将返回当前请求的验证规则。
然后在您的控制器函数中:
public function yourfunction(CustomRequest $request)

嗨@Sletheren,是的我知道这个。我想要做的是验证一组动态数据。例如,数据集1需要的字段是名字,中间名,姓氏,然后数据集2需要的字段只有名字和姓氏。所以我想到的是我会创建data1Request和data2Request。 - alvirbismonte
是的,您也可以这样做,放置一个通用的请求对象,然后使用if语句进行测试(例如:如果($request['type'] == 'data1')则执行自定义验证)。 - Sletheren
嗯,我从你说的话中得到了一些想法。谢谢@Sletheren。 - alvirbismonte
很高兴我能帮到你 :) - Sletheren

0

第一步:制定一个特点

 public function store(Request $req)
{
    $model = (new $this->modelClass);

    $this->_modiformRequest($model, $req);

    $this->_makevalidateform($req);

    $savedModel = $this->_save($req, $model);

        return redirect()->route('web.dashboard'));
}

 protected function _modiformRequest($model, Request &$request)
{
    //
}

 protected function _rules($request, $id = null): array
{
    return [];
}


 protected function _makevalidateform($request, $id = null)
{
    $this->validate($request, $this->_rules($request, $id), $this->_ruleMessages($request, $id), $this->_ruleAttributes($request, $id));
}

第二步:创建一个控制器
 protected function _rules($request, $id = null): array
    {
        if ($id) {
            return [
                'first_name' => 'required',
                'last_name' => 'required',
            ];
        }

        return [
            'first_name' => 'required',
            'last_name' => 'required',
            'password' => 'required',
        ];
    }

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接