在此示例中,如何分离SQL和业务逻辑?

时间:2011-06-02 20:38:02

标签: php abstraction data-layers

我一直在网上寻求有关如何设计我的php类以分离我的业务逻辑和数据层的帮助。我已经开始设计一个我认为非常酷的课程但后来发现了PDO和ADODB并且有一个很好的面孔时刻意识到我正在重新创建方向盘。我现在的问题是我仍然不太明白如何分离我的逻辑和所有SQL查询。

我从数据库架构中删除了大部分内容,并放下了这两个表,因为我觉得它们很容易理解。假设我有一些文件,它们在我的服务器上保存在目录中的路径(这些目录可以在其他目录中)。假设我需要一些基本功能,比如从我的一个文件中获取根目录,或者获取当前目录中的目录列表。

+--------------------+ +----------------+
| Files              | | Directories    |
+--------------------+ +----------------+
| id                 | | id             |
| name               | | name           |
| path               | | directory_id   |
| directory_id       | +----------------+
+--------------------+

精心设计的课程会是这样的:

class Files {
    public function __construct( $file_id ) {}
    public function getDirectory() {}
    public function getRootDirectory() {}
    public function getPath() {}
    public function move( $directory_id ) {}
}

class Directories {
    public function __construct( $directory_id ) {}
    public function getRootDirectory() {}
    public function move( $directory_id ) {}
    public function listContent() {}
}

我使用通过构造函数传递的ID在构造函数中获取对象的所有数据?我是否应该在构造函数中传递PDO对象,或者我是否缺少一些有价值的设计模式?是否应该在这里对所有SQL进行硬编码?我用PDO得到的一件事是我可以很容易地从MySQL切换到MSSQL但是它们的SQL语法都有差异所以不会给我带来问题吗?

我知道这些是更多的理论问题而没有一个好的答案,但我缺乏工作同事讨论这个问题(当我说他们甚至不知道设计模式是什么时,我不是在开玩笑)所以我发现自己转向网络。如果我的问题太模糊,请随意提出一个好的讨论类型的地方,我可以问这种东西,我会非常感激:)

2 个答案:

答案 0 :(得分:2)

很难说这对你的真实情况有多大影响,但你应该查看ORM(对象关系映射)可以为你做些什么。有许多非常有用的ORM解决方案,可以使这些东西更简单。当然,它们并不适用于所有解决方案,但ORM可以帮助您在中间层实现逻辑(通常是)。

答案 1 :(得分:1)

如果您希望保持SQL与所有DMBS一起工作,请从评论中读取,我认为您可以使用一些SQL抽象层。

我建议您Zend_DB_Select http://framework.zend.com/manual/en/zend.db.select.html

如果您阅读其功能,则说明:

  • SQL查询的某些部分的数据库无关抽象;