繁体   English   中英

Symfony 2中的DDD-如何与Validator服务进行交互?

[英]DDD in Symfony 2 - How to interact with Validator service?

前一段时间,我开始玩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验证不适合您,但仅限于基础/应用层)

实际上,域仍然不能保证URL是有效的,因为仍然由应用程序层提供验证(如果Validator类始终返回true怎么办?),所以这就是我反对的原因。 如果仍然需要这样做,至少是从交响乐转换为任何其他类型的验证器,您的域保持不变,并且您的域未与特定的第三方库耦合,并且任何应用程序都可以提供自己的验证器(因为您的域可供Web,移动,桌面,外部API调用等应用程序使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM