php – Symfony 2中的DDD – 如何与Validator服务交互?
前段时间我开始玩DDD了.目前,我所有的课程都是POPO.几乎所有内容都是完整的,但我想在持久性之前验证我的实体.
我已经知道在哪里放置验证(命令/用例对象),但理想情况下我想在应用程序/基础架构层中使用验证器服务.对我来说,验证应该是域层的一部分,但如果我把它放在那里,我会有很多重复. 你遇到过这样的问题吗?那有什么合理的解决方案吗?谢谢大家! 解决方法
不要混淆验证类型,我知道它混淆并且不容易分离概念并以正确的方式执行,但不要放弃.
有业务验证应该属于您的域,并且不使用任何外部组件/框架来验证(因为您的域应该是最干净和最自然的),以及应用程序验证,它应检查URL是否有效,如果用户已通过身份验证,您可以使用Symphony或任何您想要的框架/插件. 您的域名应该是最自然和最干净的,您甚至可以将其展示给业务分析师并讨论事情.您放入域中的验证应遵循此概念,这意味着业务分析师甚至可以指向您,如果验证是正确的,并建议更改,如果是这种情况.实际上,在我工作的地方,有时甚至是关键用户都会看到域名(代码和图表)并指出事情. 现在假设您确实要验证URL是否在您的域内有效,并且不遵循始终有效方法(建议使用),您可以假设应用程序层已经为您验证了URL.相反,您确实希望在域中有一行代码,明确地尝试验证URL.如果这是一个要求(我反对,但我正在给它一个可能的解决方案),我会这样做: // This would belong to your domain... interface IValidator { public function IsValidURL($url); } class Foo { public function SaveURL($url,$validator) { if (!$validator instanceof IValidator) throw new Exception("Invalid validator providen to Foo!"); if (!$validator->IsValidURL($url)) throw new Exception("The URL $url is not valid!"); // Do logic } } // ...and this to your Application Layer class SymphonyValidator implements IValidator { public function IsValidURL($url) { // use Symphony validator or any other framework/plugin } } var foo = new Foo(); var validator = new SymphonyValidator(); foo->SaveURL("invalidUrl",validator); 但请记住,这只是在您的域中调用验证方法的一种解决方法,注入第三方组件来完成艰苦的工作.我个人反对这一点,但如果有人问你“你在哪里保证URL有效?我在你的域名中找不到它”你可以这样做(我认为URL验证不适合商业,但是对于infra / app图层) 实际上,域仍然不能保证URL是有效的,因为验证仍由应用层提供(如果Validator类总是返回true会怎样?),这就是我反对这一点的原因.无论如何,如果您需要此功能,至少如果您从symphony更改为任何其他类型的验证器,您的域将保持不变,并且您的域不会耦合到特定的第三方库,并且任何应用程序都可以提供自己的Validator(因为您的域名)可以被web应用程序,移动,桌面,外部API调用等应用程序使用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |