簡體   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