php DAL - 独立的实体和数据库?

标签 php database oop model

我一直在研究和阅读大量关于在 PHP 中使用不同层来创建可维护和可读代码的内容。 但是,我看到很多代码将实体和数据库访问放在一个类中。 例如:

class User{
     public $id;
     public $username;
     public $database;

     function add(){
           $database->query ....
     }
}

我觉得这很奇怪,因为在这里您将 User 类与数据库元素混合在一起,这使得维护起来更加困难。

我喜欢这样工作:

  • 一个单独的数据库类
  • 一个用户类
  • 一个用户数据类

它是这样工作的:

$database = new Database();
$database->openConnection();
$dataUser = new DataUser($db);
$user = new User(1,"myname");
$dataUser->saveUser($user);

所以我想知道,我的工作方式是否正确,或者第一种方式是否是创建代码的更好方式? 我发现可能很容易维护,因为您有一个单独的实体和一个单独的数据库类来处理数据库操作。

最佳答案

我做什么:

我的模型不是链接到数据库的实体(当我不使用学说时),所以没有“事件记录”方法。对象不知道如何获取其依赖项(例如,用户可能有 n 条评论,我的模型不知道如何获取评论)。

class User{
private $name;
private $password;
// getter and setters
}

我的服务包含一些可以从提供者那里获取模型的业务逻辑,一个服务可以有很多提供者。

class UserService{
    function __construct(IUserProvider $userProvider){
        $this->userProvider = $userProvider
    }
    function getUsers(){
       // return an array of user objects
       return $this->userProvider->getUsers();

    }
}

我终于有了一个知道如何从数据库请求数据的数据提供者,一个文本文件,一个 json 文件,一个网络服务:

 class UserProvider implements IUserProvider{
      function __construct(Connection $connection){
         $this->connection = $connection;
      }
      function getUsers(){
         return $this->toUsers($this->connection->fetchAssoc("Select * from users"));
      }
      function toUsers(array $datas){
          // convert user records to an array of User
          (...)
          return $users;
      }
 }

然后是界面

interface IUserProvider{
     /**@return array an array of User */
     function getUsers();
}

如果我需要获得用户评论,那么我的评论服务知道如何从用户 ID 获取评论。因此,要获得用户及其评论,我需要向数据库发出 2 个请求。一个来自 UserProvider ,另一个来自 CommentProvider。

所以我有 3 层:

  • 我的应用层(显示用户,响应任何请求...)
  • 我的服务层(它必须使用命令行界面并且不知道我的网络应用程序,除了通常绑定(bind)到我使用的框架的密码编码,以及 ACL 东西可能......)
  • 我的数据访问层对其他层一无所知,

层间通信的唯一方式是通过我在层与层之间传递的模型。

而且我所有的类都是用依赖注入(inject)容器构建的,所以布线不是问题。

这是我制作的一个应用程序示例,它是开源的:https://github.com/Mparaiso/silex-bookmarkly

欢迎任何想法。

关于php DAL - 独立的实体和数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15472812/

相关文章:

oop - API — CFC与cfinclude

php - FPDF 右边距值无效

PHP DOMDocument 剥离 HTML 标签

php - 在 PHP 中使用动态变量实例化对象的含义

WCF - 如何以更面向对象的方式定义服务?

php - 从 MySQL 中获取查询并将其打印在 javascript 日历中

PHP 下拉菜单查询另一个下拉菜单查询结果

php - 自升级为山狮以来,PHP错误处理已消失

mysql - 尝试在 mysql 中的文件名末尾添加 .jpg 时出错

database - 一种将结果从 Pig 导出到数据库的方法