1

私が取り組んでいるプロジェクトのデータベース接続を作成\処理する方法について、アドバイス\提案が必要です。PHP 5.4.3 を使用して会社用の単純な作業指示システムを作成していますが、現在、その複雑さの準備ができていないため、認証の種類はありません。これまでのところ、次の構造を計画しています

<? php
class Db {
    private static $dbh = null;

    static function open_connection() {
        self::$dbh = new PDO(... }

    static function query($sql) {
        $result = self::$dbh->... }

    static function fetch_array($result){
        ...}
...

}

class Workorder extends Db {

    protected static $table_name = ...
    ...

    public $wonum;  
    ...

    function instantiate {
    //return workorder objects
    ...}

    function findallwos {
    //find all work orders...
    ...}

...}

これは、すべての作業指示書を表示する必要があるページや、新しい作業指示書を入れる必要があるページではうまくいくと思います。しかし、非常に単純なクエリを必要とするページがいくつかあります。たとえば、レポート ページの 1 つには、私たちが働いている 3 人の技術者のドロップ ダウン リストが表示されるだけです。グローバルな $dbh 変数を使用していれば、

function create_dropdown () {
    GLOBAL $dbh;

    $sql = "select...";
    $sth = $dbh->prepare($sql);
    $sth->execute();
    $arry = $sth->fetchAll(PDO::FETCH_ASSOC);
    .....

しかし、最終的にはグローバル変数では機能しない可能性があるこのサイトに将来の複雑さを追加したいので、グローバル変数には近づきません。(認証などを伴う複数のユーザーを含む)。だから私の質問は:

私が設計した Db クラスを使用するのではなく、接続を渡す代わりにある種の connection_factory クラスを使用する必要がありますか? (そして、私のworkorderクラスを何かの拡張にしないでください)

単純なクエリを取得するには、Db クラスへの静的呼び出しを使用する必要がありますか?db::fetch_array...

または、他に何か提案はありますか?これについてはさまざまな方法に出くわしましたが、理想的には、異なるユーザーを複数のユーザーを追加する時点ですべてを完全に再コーディングする必要がないように、これを設計したいと考えています。パーミッションなど

4

1 に答える 1

1

あなたが提供したコード設計について私が個人的に批判するのは、関心の分離がなく、抽象化がないということです。SQLステートメント、プレゼンテーションの種類、ビジネスロジックをコード全体に混在させる前に、多くの人が犯した大きな間違いを犯さないでください。ある時点で、データベース製品を切り替えたり、モバイルバージョンを作成したり、機能を追加したりすることができます。その後、数十のファイルを変更する必要があります。

これらのことを一般的に防ぐために、私はこのようなアプローチを提案します:

  • エンティティとその関係のクリーンで軽量なモデルを作成し、この時点で永続性(つまり、データベース)やアクセス制御などを気にしないでください(たとえば、のクラスWorkorderを含む単純なクラスEmployee...)
  • モデルで必要な永続化操作を定義するインターフェースを記述します(つまり、saveWorkorder(Workorder $ workorder)、getAllWorkorders()、loadWorkorder()、...)。コードでは、これらのインターフェースとそれらが提供するメソッドのみを参照し、具体的な実装は参照しないでください
  • ここで、特定のDBを使用して永続性インターフェイスのクラスを実装します。基本的なDBアクションをクラスにカプセル化することを忘れないでください。また、多くの永続化クラスでそれらを使用します。

私の答えが曖昧すぎないことを願っていますが、ソフトウェア設計は非常に幅広い分野であり、1つの答えですべての側面を網羅することは困難です。また、ソフトウェア設計に関するすべての質問と同様に、具体的なプロジェクト、要件、個人的なコーディングスタイルなどに大きく依存するため、正しい解決策や間違った解決策はありません...

ちなみに、この種のプロジェクトをさらに行う予定がある場合は、フレームワーク(Zend Framework、Symphony、CakePHPなど)で多くのことを知ってもらうために時間を費やすと、おそらく報われるでしょう。データベースコネクタ、ビューの分離、ビジネスロジックなど、すぐに使用できる既存の機能の...

于 2012-06-06T05:26:39.253 に答える