实现DDD封装

时间:2012-09-30 04:50:04

标签: php oop domain-driven-design

我希望我正在遵循程序,这个问题就足够了。我试着搜索无济于事,所以我希望我能在这里得到答案。

我刚开始进入Laravel。我注意到一种名为DDD的新设计方法,我想尽可能地尝试实现它。

假设我有一个位于models文件夹中的用户包。使用主类来访问验证用户等功能是一种好习惯吗?这个类将位于包的主目录中,并且将被称为User。从本质上讲,这将封装存储库,实体和服务。这样,需要这些数据的控制器不会受到一堆调用的污染。

例如:要验证用户登录信息,请致电:

 User->validateUserLogin($username, $password);

然后在User->validateUserLogin:

public function validateUserLogin($username, $password)
{
    $user_login = new User_Login_Entity($username, $password);
    // Assume the validation returns a valid User object on successful validation
    $User = User_Validation_Service->ValidateUserCredentials($user_login)
}

我是不是错了?我知道SRP是这方面的关键,我不确定我是否足够好/或者完全跟随它。基本上我的想法是:从控制器到模型工作的一个切入点。这与控制器调用存储库,服务和实体相反。

2 个答案:

答案 0 :(得分:3)

你快到了。您应该提供从控制器POV到使用“模型”的“用例”的访问权限。执行此操作的代码通常称为应用程序服务。它们位于您的模型和控制器之间。现在,请注意当我说“用例”时,我真正的意思是改变你的应用程序/系统/服务的状态的行为。这不包括查询或其他问题 - 间接 - 是查询。这些最好使用数据存储区上的非常薄的图层建模。但是......应用程序服务可以执行查询以完成,没有任何错误。它不是黑色和白色,只是不同的灰色阴影。从控制器的角度来看,在动作和查询之间做出非常明确的区分是非常明智的,因为它依赖于瘦查询层和应用程序服务。

答案 1 :(得分:-2)

 $User = User_Validation_Service->ValidateUserCredentials($user_login)
          here is the problem ----------------------------------------^

声明后应该有;

应该是

  $User = User_Validation_Service->ValidateUserCredentials($user_login);