这让我困扰了很长一段时间,但现在我找到答案是必要的。
我们正在使用CodeIgniter和Doctrine进行相当大的项目。
我们的应用程序有一个前端和一个管理区域供公司检查/更改/删除数据。
当我们设计前端时,我们只是在控制器中消耗了大部分Doctrine代码:
//In semi-pseudocode
function register()
{
$data = get_post_data();
if (count($data) && isValid($data))
{
$U = new User();
$U->fromArray($data);
$U->save();
$C = new Customer();
$C->fromArray($data);
$C->user_id = $U->id;
$C->save();
redirect_to_next_step();
}
}
显然,当我们去做管理员视图时,代码重复开始并且考虑到我们处于“get it DONE”模式,所以它现在发现代码膨胀很糟糕。
我已经使用模型方法将大量功能(业务逻辑)移动到模型中,但基本的CRUD不适合那里。
我打算尝试将CRUD放入静态方法,即Customer :: save($ array)[将执行插入和更新,具体取决于数组中是否存在prikey],Customer :: delete($ id) ,Customer :: getObj($ id = false)[如果为false,则获取所有数据]。对于32个模型对象(并且正在增长),这将变得很痛苦。
此外,有时模型需要进行交互(作为用户数据和客户数据之间的上述交互),这不能在不破坏封装的情况下以静态方法完成。
我设想在此处添加另一层(公开Web服务),因此知道在某些时候将会有3个“控制器”我需要在某处(显然)封装这个CRUD,但是静态方法是要走的路,还是有另一条路?
非常感谢您的意见。
答案 0 :(得分:2)
我认为你需要把这个逻辑放到桌子上来了
class UserTable extends Doctrine_Table
{
public function register()
{
// There you do data model (not concrete object) related stuff
}
}
http://www.doctrine-project.org/projects/orm/1.2/docs/cookbook/code-igniter-and-doctrine/en
答案 1 :(得分:2)
为什么不使用立面?
class RegistrationManager {
public function register( $postData, $callBack ){
$data = get_post_data();
if (count($data) && isValid($data)){
$U = new User();
$U->fromArray($data);
$U->save();
$C = new Customer();
$C->fromArray($data);
$C->user_id = $U->id;
$C->save();
$callBack(); //I like this but you need PHP5.3
}
}
}
在您的app控制器中:
$r = new RegistrationManager;
$r->register( get_post_data(), function(){ redirect_to_next_step(); } );
Facade也是模型(在我看来),您可以使用它们来隐藏布线或复杂性并减少代码重复。