用于添加、编辑、查看和删除数据库条目的 PHP 模式


PHP pattern to add, edit, view and delete database entry

我想创建一个PHP类来包含某种数据(带有"标题"和"文本"的文章)。此类应用于不同的目的:

  • 创建一个新条目:显示一个带有空"标题"和"文本"的表单输入字段和用于将数据添加到数据库的提交按钮(之后验证)

  • 编辑现有条目(将 ID 传递给构造函数):显示包含"标题"和"文本"输入字段的表单,其中填充了检索到的数据从数据库和提交按钮将数据添加到数据库(之后验证)

  • 查看现有条目(将 ID 传递给构造函数):显示填充了不可编辑的"标题"和"文本"字段(即"H1"和"P")使用从数据库检索的数据

  • 删除现有条目(将 ID 传递给构造函数):显示填充了不可编辑的"标题"和"文本"字段(即"H1"和"P")使用从数据库检索的数据和用于从中删除数据的提交按钮数据库

这应该是一种非常常见的情况,但我还没有找到任何设计模式来执行它。你有什么建议吗?提前谢谢。

你实际上是在寻找一个DataMapper。

由于所有这些 CRUD"操作"都属于相同的职责(它们执行抽象表访问),因此无需为每个操作实现单独的类。您将实现一个抽象单个操作的方法,该方法与您正在使用的表相关。您可以这样做,例如:

class ArticleMapper
{
     protected $pdo;
     protected $table = 'some_table';
     public function __construct(PDO $pdo)
     {
         $this->pdo = $pdo;
     }
     /**
      * @return boolean Depending on success
      */
     public function insert($id, $title, $text)
     {
         $query = sprintf('INSERT INTO `table` (`id`, `title`, `text`) VALUES (:id, :title, :text)', $this->table);
         $stmt = $this->pdo->prepare($query);
         return $stmt->execute(array(
           ':title' => $title,
           ':text'  => $text,
           ':id'    => $id,
         ));
     }

     public function fetchById($id)
     {
        $query = sprintf('SELECT * FROM `%s` WHERE `id` =:id');
        $stmt = $this->pdo->prepare($query);
        $stmt->execute(array(
           ':id' => $id
        ));
        return $stmt->fetch();
     }
     // ... The rest for deleteById() and updateById()
}

好处?

好吧,如果它们不明显,那么听它们是有意义的:

  • 将应用程序逻辑与其存储逻辑分离。

这意味着您的应用程序逻辑(执行一些计算)将完全不知道数据来自何处。这使您易于维护和测试。坚持单一责任原则

  • 它的快速

虽然ORM,ActiveRecords,Query Builders确实需要额外的内存(顺便说一下,对于每个HTTP请求,也只是看看它们的类 - 它们通常很大),DataMappers不需要。您只需要为要使用的数据库供应商编写代码。

    从一个数据库供应商
  • 切换到另一个数据库供应商很容易

例如,假设您现在不确定将来是否要切换到其他数据库供应商。使用 DataMapper 时,您所要做的就是将它的实例注入到需要它的类中。

class Foo
{
    public function __construct(MapperInterface $mapper)
    {
       $this->mapper = $mapper;
    }
    public function doSomeComputationsWithId($id)
    {
        $data = $this->mapper->fetchById($id);
        // .. do computations here
        return $result;
    }
}
$mapper = new Article_MySQL_Mapper($pdo);
// or
$mapper = new Article_MongoDB_Mapper($mongoInstance);
$foo = new Foo($mapper);
print_r($foo->doSomeComputationsWithId($_GET['id']));

大多数 PHP MVC 都包含针对此类问题的良好设计模式。查看以下框架:

  • 拉拉维尔: laravel.com
  • 蛋糕PHP: cakephp.org
  • Zend框架:framework.zend.com

如果你想保持简单,只为这个问题设计一个PHP类,你应该看看CRUD,ORM和ActiveRecord。以下链接可能会派上用场: PHP ActiveRecord