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调用等应用程序使用.

相关文章

文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Onl...
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在...
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代...
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔...
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了...
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安...