1

私は、ビジネスロジックとデータレイヤーを分離するためにphpクラスを設計する方法についてオンラインでヘルプを探していました。私はかなりクールだと思ったクラスの設計を始めましたが、その後PDOとADODBを発見し、ホイールを再現していることに気付いた素晴らしい瞬間を過ごしました。今の私の問題は、ロジックとすべてのSQLクエリを分離する方法をまだ完全に理解していないことです。

私はDBスキーマからほとんどすべてを取り除き、これら2つのテーブルを配置しました。これは、それらが非常に理解しやすいと思うからです。サーバーに保存されているパスがディレクトリにあるファイルがあるとします(これらのディレクトリは他のディレクトリにある可能性があります)。ファイルの1つからルートディレクトリを取得したり、現在のディレクトリ内のディレクトリのリストを取得したりするなどの基本的な機能が必要だとします。

+--------------------+ +----------------+
| 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で得られることの1つは、MySQLからMSSQLに非常に簡単に切り替えることができるということですが、どちらもSQLの構文に違いがあるため、問題は発生しませんか?

これらは1つの良い答えがない、より理論的な質問であることは知っていますが、これについて話し合う同僚が不足しているため(デザインパターンが何であるかさえ知らないと言っても冗談ではありません)、Webに目を向けています。私の質問が曖昧すぎる場合は、この種の質問をすることができる良いディスカッションタイプの場所を自由に提案してください。私は非常に感謝しています:)

4

2 に答える 2

2

これが実際の状況にどの程度当てはまるかを判断するのは難しいですが、ORM(Object-Relational Mapping)で何ができるかを調べる必要があります。非常に便利なORMソリューションが数多く存在するため、このソリューションをはるかに簡単にすることができます。もちろん、すべてのソリューションに適しているわけではありませんが、ORMは、ロジックが属する中間層(通常)にロジックを実装するのに役立ちます。

于 2011-06-02T20:44:35.747 に答える
1

コメントから読み取ったように、SQLをすべてのDMBSで機能させ続けたい場合は、SQL抽象化レイヤーを使用できると思います。

http://framework.zend.com/manual/en/zend.db.select.htmlをお勧めしますZend_DB_Select

あなたがその特徴を読むならば、それは述べられます:

  • SQLクエリの一部のデータベースに依存しない抽象化。
于 2011-06-02T20:47:03.907 に答える