ran*_*zer 7 php model-view-controller
我对如何使用MVC执行插入和更新语句感到有点困惑.是否可以在控制器中创建对象的实例并将其传递给您的服务以保存它,或者您是否将数据传递给您的服务并处理其中的所有其他内容?
插入
在我的控制器中,例如:
$userservice->insert("myname","mypassword");
Run Code Online (Sandbox Code Playgroud)
在我的UserService中:
function insert($username,$password){
$user = ORM::for_table('user')->create();
$user->username= $username;
$user->password= $password;
$user->save();
}
Run Code Online (Sandbox Code Playgroud)
更新
在我的控制器中,例如:
$userservice->update("myname","mypassword",1);
Run Code Online (Sandbox Code Playgroud)
在我的UserService中:
function insert($username,$password,$id){
$user = ORM::for_table('user')->find($id);
$user->username= $username;
$user->password= $password;
$user->save();
}
Run Code Online (Sandbox Code Playgroud)
这是好习惯吗?因为我看到很多这些答案,例如在控制器中创建用户并将其传递到存储库以保存它: PHP中的正确存储库模式设计? 但我不喜欢在控制器中创建用户的想法......
控制器属于应用程序层,仅控制活动.在您的示例中,活动是现有用户或新用户的创建和更新.这些操作属于域层,其中包含服务.因此,服务将域封装为网守,并提供解析域的操作,如外观.
是否可以在控制器中创建对象的实例并将其传递给您的服务以保存它,或者您是否将数据传递给您的服务并处理其中的所有其他内容?
该服务应提供传递ValueObject的方法.ValueObjects最好封装大量数据(User的属性值).在服务内部,应该将ValueObject委托给Filter和Validator.如果验证没有失败,则ValueObject将被委托给DataMapper.DataMapper将ValueObject的属性映射到UserRepository(ORM)的数据模型.存储库通常需要另一种数据模型,例如,基于像MySQL这样的RDBMS的对象与存储介质.
这种方法应该严格,以分离层之间的关注,以提高可维护性和可互换性.服务应该很薄,并充当域对象(过滤器,验证器等)的委托者,例如,请参阅服务层模式.
那么,应该在哪里创建一个值对象?
我希望该服务为此提供一种方法:getEntityPrototype()使用原型模式.注意命名.ValueObject是一个没有标识的对象.实体是具有身份的对象(此处为用户ID).对于现有用户,您将拥有类似的方法getUserById($id),该方法应返回UserEntity.如果给定id不存在User,则应返回NullObject.要创建新用户,getEntityPrototype()将返回一个尚未具有标识的UserEntity,因此您将其称为ValueObject或更好的Protity of Entity.设置属性(例如,通过FormObject)并持久化此对象是一个真实的实体.在此服务的Factory中,您可以设置EntityPrototype.
| 归档时间: |
|
| 查看次数: |
1021 次 |
| 最近记录: |