使用Doctrine来抽象CRUD操作

时间:2010-06-03 01:36:21

标签: php doctrine crud

这让我困扰了很长一段时间,但现在我找到答案是必要的。

我们正在使用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,但是静态方法是要走的路,还是有另一条路?

非常感谢您的意见。

2 个答案:

答案 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也是模型(在我看来),您可以使用它们来隐藏布线或复杂性并减少代码重复。