2010-06-03 34 views
3

这已经困扰了我很长一段时间,但现在我有必要找到答案。使用原则来抽象CRUD操作

我们正在研究使用CodeIgniter和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(); 
    } 
} 

显然,当我们去到做管理的意见代码重复开始,并考虑到我们是在一个“得到它完成“模式,所以它现在与代码膨胀臭。

我已经使用模型方法将许多功能(业务逻辑)转移到模型中,但基本的CRUD并不适合此处。

我打算尝试将CRUD放入静态方法,即Customer :: save($ array)[将执行插入和更新,具体取决于prikey是否存在于数组中],Customer :: delete($ id ),Customer :: getObj($ id = false)[如果为false,则获取所有数据]。尽管对于32个模型对象(并且在增长),这将变得很痛苦。

此外,有时模型需要进行交互(如用户数据和客户数据之间的上述交互),这不能在不破坏封装的静态方法中完成。我知道有一些地方需要3个“控制器”,我需要将这个CRUD封装在某个地方(显然),但是它们是静态方法,还是有另一条路?

您的建议非常感谢。

回答

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 
     } 
    } 
} 

在你的应用程序控制器:

$r = new RegistrationManager; 
$r->register(get_post_data(), function(){ redirect_to_next_step(); }); 

外立面都是模特太(在我看来),你可以使用它们来隐藏布线或复杂性和减少代码的重复数据删除。

+0

这很有道理。我认为我太想到了,模型必须以1:1的对象与表关系;需要在箱子外面多思考。谢谢。 – TomWilsonFL 2010-06-12 20:50:38