Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel中的表单请求验证:根据方法(POST、PUT或DELETE)需要_Php_Laravel_Validation - Fatal编程技术网

Php Laravel中的表单请求验证:根据方法(POST、PUT或DELETE)需要

Php Laravel中的表单请求验证:根据方法(POST、PUT或DELETE)需要,php,laravel,validation,Php,Laravel,Validation,我正在使用Laravel中的表单请求进行验证。我注意到一种模式一直在出现,我在SE上找不到解决方案(或者至少谷歌搜索它对我没有帮助) 假设我们正在创建一个API,并使用Laravel的apiResource来创建常用的CRUD方法:store、update和delete 显然,当我们存储新记录时,字段id不是必需的,但其余字段可能是必需的(在大多数情况下是必需的)。但当我们更新记录时,我们面临着相反的情况id为必填项,而不再需要其他字段 是否可以在Laravel中使用一个表单请求来处理这种情况?

我正在使用Laravel中的表单请求进行验证。我注意到一种模式一直在出现,我在SE上找不到解决方案(或者至少谷歌搜索它对我没有帮助)

假设我们正在创建一个API,并使用Laravel的apiResource来创建常用的CRUD方法:
store
update
delete

显然,当我们存储新记录时,字段
id
不是必需的,但其余字段可能是必需的(在大多数情况下是必需的)。但当我们更新记录时,我们面临着相反的情况<代码>id为必填项,而不再需要其他字段

是否可以在Laravel中使用一个表单请求来处理这种情况?如果以智能方式避免代码重复,我们是否可以使用Laravel的
required\u


编辑:它不一定是Laravel解决方案。使用PHP的解决方案也可以(只要它干净且遵循可靠的原则)。

我多次遇到这个问题,我理解您的沮丧

从我的观点和专业经验来看,最好的解决方案是始终为每个案例指定特定的
FormRequest
s:

  • 一个用于
    存储
    ,具有自己的规则
  • 其他用于
    更新
    ,具有类似规则,但与
    存储
  • 最后一个用于
    删除
    (确保规则比其他规则少,且无重复)
我知道您说过“无代码复制”,但就目前而言,这是不可能的(但您不应该像我之前所说的那样有代码复制)


你说过“只要它干净,遵循坚实的原则”,记住坚实,S=单一责任,因此,如果你想用一个
FormRequest
解决这个问题,你已经在破坏
S
我无法想象一个
FormRequest
有10个或15个输入,这取决于它是
存储
更新
还是
删除
。这是不干净的,肯定不会遵循可靠的原则。

检查方法,然后根据该方法返回一组规则,怎么样?例如,我有一个具有以下规则的InvoiceFormRequest。所以我可以使用一个表单请求来实现两种不同的方法

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
    if ($this->isMethod('post')) {
        return [
           'template' => 'required',
           'due_by_date'   => 'required',
           'description'   => 'required',
           'charge_items'  => 'required',
        ];
    }

    if ($this->isMethod('put')) {
        return [
            'due_by_date'   => 'required',
            'description'   => 'required',
            'charge_items'  => 'required',
        ];
    }
}

以下是我提出的两种可能的解决方案

  • 使用控制器方法返回正确的验证规则:
  • 使用
    $this->getMethod()
    而不是
    $this->route()->getActionMethod()
    ,并通过HTTP方法进行验证
  • 您还可以将验证规则存储在数组中,并对其进行操作以减少代码重复


    我认为,这在很大程度上解决了代码重复的问题。

    好吧,我部分同意你的最后一段。但我认为SOLID是可以解释的,因为应该被视为“责任”的定义可能因人而异。对我来说,验证模型的传入数据是一项责任,即使它被分解为几个子类。我想我可能会想出一个解决方案,所以如果我能找到它,我会告诉你(如果你不介意)。@stressedout,请与我分享你最好的解决方案!我很乐意看一看!但不,SOLID不开放解释,单一责任就是单一责任,例如,如果你的代码只在媒体(Facebook、Twitter、Instagram等)上共享URL,你的责任不是检查你想要哪种媒体,并且有一个文件和很多IFs,你应该有一个文件和一个使其动态的模式,但不是传说中的
    20箱开关
    (希望你跟我来)好吧,谢谢。当我想出解决方案时,我会等待你的反馈。但是,如果我碰巧在这里写了一个答案,请也向我解释为什么写if's或case switch语句是个坏主意,因为我看不出它们有什么问题。@stressed但请记住,我们使用的是对象,面向对象的思想是将一切尽可能地简化,因此在您的情况下,不应该忽略思考“我必须验证数据”,应该是“我必须验证用于存储的数据”(这是一项职责),“我必须验证用于更新的数据”(2),“我必须验证用于删除的数据”(3),这是你必须处理的3个不同的责任。想象一下,如果你必须为你的代码做测试用例,那么你将为3个主要关注点中的每一个都有很多用例,因此有3个不同的责任。@有压力但如果有if或case switch语句并不坏,但是如果最好的方法不同,这可能是坏的,就像我之前所说的比如说,如果你有在媒体上共享URL的代码,作为一个初学者,你肯定会使用大量的
    if
    switch
    ,你应该使用构建器模式。我对模式不是100%擅长,这是我必须掌握的,但是理解诸如构建器、映射器等基本模式很重要。谢谢。这是是一个很好的解决方案。我也提出了一个类似的解决方案,只是在Laravel中使用了不同的函数。(+1)@stressedout这是一个不错的解决方案,但您仍然只在一个文件中保留规则(打破实体),但如果您还必须使用
    authorize
    您将为该部分执行另一个if。您是否将id字段公开为可由用户操作的表单输入?如果id是主键,则不建议通过表单公开id字段进行操作。如果您不通过表单公开id字段,则不会我想我甚至不需要任何验证。1)我已经在另一个用户身上回答了这个问题,但你仍然在某种程度上破坏(稳定)。现在控制器还必须知道要使用哪些规则,如果它在
    FormRequest
    中,那就是
    FormRequest<
    
        public function rules()
        {
            $method = $this->route()->getActionMethod();
    
            switch($method){
                case 'store':
                    return [
                        \\ validation rules
                    ]
                ...
            }
        }