gpt4 book ai didi

php - MVC - 如何将数据传递给服务

转载 作者:可可西里 更新时间:2023-11-01 12:50:42 24 4
gpt4 key购买 nike

我对如何使用 MVC 执行插入和更新语句有点困惑。可以在 Controller 中创建对象实例并将其传递给服务以保存它,还是可以将数据传递给服务并处理其中的所有其他内容?

插入

在我的 Controller 中是这样的:

$userservice->insert("myname","mypassword");

在我的 UserService 中:

function insert($username,$password){
$user = ORM::for_table('user')->create();
$user->username= $username;
$user->password= $password;
$user->save();
}

更新

在我的 Controller 中是这样的:

$userservice->update("myname","mypassword",1);

在我的 UserService 中:

function insert($username,$password,$id){
$user = ORM::for_table('user')->find($id);
$user->username= $username;
$user->password= $password;
$user->save();
}

这是好的做法吗?因为我看到很多这样的答案,例如在 Controller 中创建用户并将其传递到存储库以保存它: Proper Repository Pattern Design in PHP?但我不喜欢在 Controller 中创建用户的想法...

最佳答案

Controller 属于应用层,只控制事件。在您的示例中,事件是为现有用户或新用户创建和更新。这些操作属于包含服务的领域层。因此,服务将域封装为看门人,并像外观一样提供解析域的操作。

Is it ok to create an instance of an object in your controller and pass it to your service to save it or do you pass data to your service and handle everything else in there?

服务应提供一种方法来传递 ValueObject . ValueObjects 更适合封装大量数据(用户的属性值)。在服务内部,ValueObject 应该委托(delegate)给 Filter 和 Validator。如果验证没有失败,ValueObject 将被委托(delegate)给 DataMapper . DataMapper 会将 ValueObject 的属性映射到 UserRepository (ORM) 的数据模型。存储库通常需要另一种数据模型,例如对象与基于 RDBMS(如 MySQL)的存储介质。

这种方法应该严格分离层之间的关注点,以提高可维护性和可互换性。服务应该是瘦的,并充当域对象(过滤器、验证器等)的委托(delegate)者,例如参见 Service Layer Pattern .

那么,应该在哪里创建值对象?

我希望服务为此提供一个方法:getEntityPrototype() 通过使用 prototype pattern .命名要小心。 ValueObject 是一个没有标识的对象。 Entity是具有身份的对象(此处为用户 ID)。对于现有用户,您将拥有一个类似 getUserById($id) 的方法,它应该返回一个 UserEntity。如果给定 id 的用户不存在,它应该返回 NullObject .要创建一个新用户,getEntityPrototype() 将返回一个尚无身份的 UserEntity,因此您可以将其称为 ValueObject 或更好的实体原型(prototype)。在设置属性(例如通过 FormObject)并持久化之后,这个对象就是一个真实的实体。在此服务的工厂中,您可以设置 EntityPrototype。

关于php - MVC - 如何将数据传递给服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com