我试图在两种关于数据验证的模式之间做出决定:

>我尝试遵循名义工作流程并捕获我的模型和服务抛出的异常:唯一/外部约束违规,空字段,无效参数等…(!!我只捕获我知道应该的异常)

>专业人员:在我的控制器和服务中编写的代码非常少:我只需处理异常并将其转录为用户可理解的消息.代码非常简单易读.
>缺点:我需要编写特定的异常,有时可能会有很多不同的异常.我还需要捕获并解析数据库异常(约束违规等等)的泛型PDO / Doctrine异常,以将它们转换为有意义的异常(例如:DuplicateEntryException).我也无法绕过一些验证:假设我的模型的一个对象被标记为已锁定:尝试删除它会引发异常.但是我可能想强制删除它(例如使用确认弹出窗口).我不能在这里绕过这个例外.

>我使用代码和数据库查询显式测试和预验证所有内容.例如,我将测试某些东西不是null,并且在将其设置为模型中的属性之前是一个整数.或者我将进行数据库查询以检查我是否不会创建重复的条目.

>专业人士:不需要编写特定的异常,因为我预先验证了所有内容,所以我不应该做很多try / catch.如果我愿意,我也可以绕过一些验证.
>缺点:在控制器,服务和模型中编写大量测试和验证.我将执行更多查询(验证部分).数据库已经对外键,唯一约束,而不是空列进行了验证……我不应该忽略它并自己重新编码.这也导致非常无聊的代码!

我宁愿使用一种模式或另一种模式,而不是混合模式,以使事情尽可能简单.

第一个解决方案在我看来是最好的,但我担心它可能是某种反模式?或者可能在其理论简单性背后隐藏着难以处理的情况?

我建议数据验证应该在应用程序的周边进行.也就是说,应该检查所有进入的数据,以确保它符合您的期望.一旦被允许进入应用程序,它就不再被验证,但它总是根据上下文(数据库,电子邮件等)进行转义.这使您可以将所有验证保持在一起并避免可能的重复验证工作(很容易以及两个使用它的模型可以对数据进行两次验证的示例.)Joe Armstrong在他关于Erlang的书中推广了这种方法,他为telcom工作站编写的软件运行多年而没有重新启动,所以它似乎运行良好: )

此外,模型期望并不总是与特定界面建立的期望完全一致(可能表格只显示潜在选项的子集,或者界面可能是美国各州的下拉,而模型存储来自许多国家有时复杂的接口可以以增强用户体验的方式集成多个不同的模型对象.虽然对用户很好,但是使用异常方法的这些模型的交互可能非常难以处理,因为一些输入可能是混合输入,两种模型都不能单独验证.您总是希望确保验证首先符合UI的期望,而第二种方法允许您在最复杂的界面中执行此操作.

而且,异常处理在周期方面相对昂贵.验证问题可能非常频繁,我会尽量避免处理问题这么昂贵的操作,而不是频繁发生.

最后,一些验证对于模型来说并不是必需的,但它可以防止攻击.虽然您可以将其添加到模型中,但添加的功能可能会使模型代码快速混乱.

那么,在这两种方法中,我建议采用第二种方法,因为:

>您可以为您的应用创建一个清晰的边界.>所有验证都在一个地方,可以共享.>如果两个或更多模型使用相同的输入,则不会重复验证.>模型可以专注于他们擅长的领域:将抽象实体的知识映射到应用程序状态.>即使是最复杂的UI也可以进行适当的验证.>抢占可能会更有效率.>不能真正属于任何模型的以安全为中心的验证任务可以干净地添加到应用程序中.

php – 抢先验证或异常处理?的更多相关文章

  1. HTML5实现直播间评论滚动效果的代码

    这篇文章主要介绍了HTML5实现直播间评论滚动效果的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 前端监听websocket消息并实时弹出(实例代码)

    这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5之消息通知的使用(Web Notification)

    通知可以说是web中比较常见且重要的功能,私信、在线提问、或者一些在线即时通讯工具我们总是希望第一时间知道对方有了新的反馈。本篇文章主要介绍了HTML5之消息通知的使用(Web Notification),感兴趣的小伙伴们可以参考一下

  4. HTML5中的Web Notification桌面通知功能的实现方法

    这篇文章主要介绍了HTML5中的Web Notification桌面通知功能的实现方法,需要的朋友可以参考下

  5. HTML5仿微信聊天界面、微信朋友圈实例代码

    小编最近开发一个基于html5开发的一个微信聊天前端界面,功能很全面,下面小编给大家分享实例代码,需要的朋友参考下

  6. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

  8. ios – Testflight无法安装应用程序

    我有几个测试人员注册了testflight并连接了他们的设备……他们有不同的ios型号……但是所有这些都有同样的问题.当他们从“safari”或“testflight”应用程序本身单击应用程序的安装按钮时……达到约90%并出现错误消息…

  9. xcode找不到匹配的配置文件

    我有一个AdhociOS应用程序,它给了我“在xcode6中找不到匹配的配置文件”,我创建了一个Adhoc配置文件,下载它,双击它并在General–Identity下选择了一个团队.但我接着得到了那条消息,并尝试使用“修复问题”按钮没有帮助.在构建设置–供应配置文件–发布我有“自动”.任何人都可以帮助我,我完全迷失了……

  10. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部