Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.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
Javascript 更新记录时,对于缺少可选字段值的服务器端行为,什么应该是正确的?_Javascript_Php_Angularjs_Laravel_Architecture - Fatal编程技术网

Javascript 更新记录时,对于缺少可选字段值的服务器端行为,什么应该是正确的?

Javascript 更新记录时,对于缺少可选字段值的服务器端行为,什么应该是正确的?,javascript,php,angularjs,laravel,architecture,Javascript,Php,Angularjs,Laravel,Architecture,我们有一个Angular+Laravel5应用程序,我们试图坚持RESTful设计(不过,老实说,我们没有完全实现它) 我注意到,随着时间的推移,我们在更新记录时处理可选字段的空值时积累了一些不一致。下面是发生的情况: 在某些情况下,程序员忽略了可选值丢失的事实,只将接收到的值传递给Laravel模型。这将导致在数据库中保持旧值不变 在某些情况下,程序员试图变得聪明,并假设-如果未收到可选字段,则用户可能希望用一些全局默认值(通常意味着null)填充它。这将导致使用数据库中的默认值覆盖旧值。令

我们有一个Angular+Laravel5应用程序,我们试图坚持RESTful设计(不过,老实说,我们没有完全实现它)

我注意到,随着时间的推移,我们在更新记录时处理可选字段的空值时积累了一些不一致。下面是发生的情况:

  • 在某些情况下,程序员忽略了可选值丢失的事实,只将接收到的值传递给Laravel模型。这将导致在数据库中保持旧值不变

  • 在某些情况下,程序员试图变得聪明,并假设-如果未收到可选字段,则用户可能希望用一些全局默认值(通常意味着
    null
    )填充它。这将导致使用数据库中的默认值覆盖旧值。令人困惑的是——在某些情况下,这种行为是我们的客户针对某些特定字段明确要求的——也就是说,如果用户没有向我们的web API发送任何内容,我们应该使用
    null
    覆盖旧值

  • 在某些情况下,程序员试图避免歧义,并拒绝请求,即使缺少可选值(为此,我们使用自定义
    present
    Laravel验证规则)。如果用户确实想用默认值填充该值,那么应该从web表单发送显式的
    null
    (或任何默认值)。这在更新时通常不是问题,因为web表单通常已经用旧值填充,但在保存新记录时会变得混乱,因为默认情况下Angular不会将未填充的表单字段发送到服务器。因此我们必须强制它,因此我们的Javascript模型最终充满了大量的模型初始化代码,比如
    {someOptionalField:null,someOptionalField2:null,…}
    。我们团队中的一些程序员认为这看起来很难看。我有一个想法,扩展Angular的ngModel指令,隐式地填充未定义的模型值中的空值,因此它们总是被发送到服务器。但我不确定这是否是正确的解决方案,因为我还没有看到互联网上其他有棱角的程序员做过类似的事情


以明确的方式解决这一问题,并让服务器端程序员和web API用户都明白这一点的正确方法是什么?有任何已知的设计模式或最佳实践吗?

我自己和我们的工作人员都在后端处理这个问题。如果有一个可选字段,它必须有一个值(听起来很有趣吧?),如果给定的输入为空或根本不存在,它将被设置为默认值。 仅仅忽略字段或将旧数据的值设置为null是不可取的,正如您所说的,不应该这样做

我喜欢在验证函数的顶部创建默认值,如果有新值,就用新值覆盖它。如果存在旧值,请将其用于默认值:

1. Validation progress starts
2. If value is given - use it
2.1 If not given, look if there is an old value for this field and if so, use it
2.2 If still no value, use default
因此,不会因为字段为空/未设置或至少不必担心它而出现错误。此外,您还可以正确处理默认值/旧值

如果序列化完整表单并将其发送到服务器,则无法发送空字段的问题可以得到补偿。 如果这不像jQuery(form.serialize())中那样简单,或者仍然有空字段,为什么不循环所有表单元素并手动创建JSON/表单数据呢


这个答案主要是基于观点的(就像问题本身一样),但我希望它能帮助你

IMO应该在使用之前定义视图模型,它与定义任何变量密切相关。仅供参考VueJS强制执行此操作。服务器端,如果该值不是必需的,并且发送为空或者根本不是空的,那么它将为null,没有例外,您应该定义您的模型,以便知道需要为null的内容和缺少的内容。基本上是正常化。首先用当前值填充数据,然后覆盖它们,对吗?@ArtisticPhoenix是的,Laravel Eloquent是这样做的,它首先读取所有字段,然后可以为某些字段填充新值,它只会更新更改的值(所谓的脏检查)。虽然这对程序员来说是简单和透明的,但它也会增加混乱。为什么将值设为空
是不可取的,而且不应该这样做
?因此,当用户/客户删除数据时,输出数据时,值仍然存在。这对我来说是一个错误。是的,你是对的,如果用户删除了它,并且该值不是必须的,那么这就可以了。但是如果它是一个字段,必须有一个默认值,你就不能把它设为null(除非null是/应该是默认值)。哦,是的,但我认为OP是在谈论可选字段,而不是那些经过验证的字段。是的,他有点这样做了。但是,如果给定了可选字段,您仍然必须验证这些字段。如果您正在检查旧值/默认值,我甚至会将其称为静态验证。