1

つい最近、以前に手続き的に書かれた Web サイトを自分で書き直し始めました。OOP のやり方にも慣れてきたので、ラッパーとして PDO を選びました。クラス編成についてアドバイスをお願いします。

カテゴリとサブカテゴリ、製品のブランド、製品、ユーザーなどの追加など、ほとんどすべてがデータベース駆動型です。それぞれが1つのクラスである可能性があり、それらすべてに対してCRUD操作が必要なため、挿入する一般的な方法が必要です、MySql データベースのレコードの更新、削除。問題はコードではなく、必要に応じて CRUD 操作の一部を自分でコーディングしたい (そしてすでに持っている) ことです。本当の問題は構造であり、それらのクラスを正しく配布および拡張するにはどうすればよいかです。

現在、3 つの異なるアプローチをコーディングしました。

  1. CRUD関数を必要とする他のすべてのクラスによって拡張される「操作」と呼ばれるクラス。このクラスには、$id、$attributes、$fields、$tableなどの非常に一般的なプロパティと、もちろん挿入、更新するための一般的なメソッドが含まれています。 、 消去。そうすることで、いくつかのパラメータ (名前、カテゴリ、価格) を持つ Product オブジェクトを作成し、すぐに Product->insert() でデータベースに挿入できます。パラメータを挿入関数に渡す必要はありません。このクラスの CRUD 関数はパラメーターを受け入れず、作成されたオブジェクトのプロパティに依存します。

  2. 上記と同じですが、CRUD 関数はパラメーターを受け入れ、以前に役に立たないプロパティを持つオブジェクトを作成せずに何かを挿入する必要がある場合に備えて、パラメーターを (おそらく) より汎用的にします。

  3. 「Operations」クラスは PDO を拡張したもので、操作方法は 2 に似ていますが、データベース接続を作成すると、他のオブジェクトに依存せずに直接アクセスできるようになりました。

私は最初のオプションに傾いています。これは、ほとんどの場合、この Web サイトで行うすべてのことを満たしてくれると思うからです。この Web サイトは既にコード化されていますが、手続き的には維持するのが面倒なので、基本的にはやり直す必要がありますが、OO.

CMS または既にコード化されたラッパー (これを行う目的は、PDO を学習し、OOP に慣れることです) は別として、それを行うための最良の方法はどれでしょうか? 私が言及したオプションに限定されません。

これは、私がこれまでコード化できた 'Operations' クラスです。サンドボックスのようなテストを行ってきました。スペイン語の変数名は気にしないでください。コードに関するアドバイスも大歓迎です。

class Operaciones {     
private $database;

protected $id;
protected $atributos;

protected $tabla;
protected $campos;

public function __construct($link) {
    $this->database = $link;
}

public function insertar() {
    if (!$this->verificarCamposNulos($this->atributos, $this->campos))
        echo 'Campos nulos<br />';
    else {
        $this->prepararCampos();
        $placeholders = $this->generarPlaceholders();           

        $stmt = $this->database->prepare("INSERT INTO {$this->tabla} ({$this->campos}) VALUES ({$placeholders})");

        $valores = array_values($this->atributos);
        $stmt->execute($valores);

        $stmt = NULL;           
        echo 'Se ha insertado exitosamente';
    }
}

public function modificar() {
    if (!$this->verificarCamposNulos() || empty($this->id))
        echo 'Campos nulos<br />';
    else {
        $this->prepararCampos('=?');                        

        $stmt = $this->database->prepare("UPDATE {$this->tabla} SET {$this->campos} WHERE id = {$this->id}");

        $valores = array_values($this->atributos);
        $stmt->execute($valores);

        $stmt = NULL;           
        echo 'Se ha modificado exitosamente';           
    }
}

private function generarPlaceholders() {
    for($i=0;$i<count($this->atributos);$i++) 
        $qmarks[$i] = '?';

    return implode(',', $qmarks);
}

// Check if the values to be inserted are NULL, depending on the field format given
private function verificarCamposNulos() {
    $n_campos = explode(',', $this->campos);

    $valores = array_values($this->atributos);

    foreach($n_campos as $i => $result) {       
        if (strstr($result, '@'))           
            if (empty($valores[$i]))
                return false;
    }

    return true;
}   

// Removes the '@' from each field, used to check which fields are NOT NULL in mysql
private function prepararCampos($sufijo = NULL) {
    $n_campos = explode(',', $this->campos);

    foreach($n_campos as $i => $result)         
        $n_campos[$i] = str_replace('@', '', $result) . $sufijo;

    $this->campos = implode(',', $n_campos);
}
}
4

0 に答える 0