0

ユーザーログインシステムを作成しようとしています。

ユーザーの作成、削除、およびログインとログアウトのためのすべての機能を含む AccessControl というクラス/コントローラーがあります。

AccessControl クラスから呼び出されるすべてのデータベース関数を含む Users というモデルもあります。

私の AccessControl クラス:

include_once('../models/User.php') ;

class AccessControl {
private $_systemKey ;

public function __construct()
{
    $this->_systemKey = 'QA>8fg)@z#t#:E60mj&MzHsm-lUj&b-}R%~<y$|nAuF)C3!r%+rT"Q<r$o?{_XR' ;
}

public function createUser($email, $password, $level)
{           
    $user_salt = $this->randomString() ;

    $password = $user_salt . $password ;
    $password = $this->hashData($password) ;

    if(!is_int($level))
    {
        return false ;
    }

    //Create verification code
    $code = $this->randomString() ;

    //SQL...
    $created = User->insertNewUser($email, $password, $level) ;

    if($created != false){
        return true; 
    }

    return false ;
}
}

そして私のモデルでは:

class User extends Core {

public function fetchSalt($username)
{
    $result = $this->db->prepare("SELECT saltword FROM users WHERE username = ?") ;
    $result->execute(array($username)) ;
    return $result->fetchColumn() ;
}

public function insertNewUser($email, $password, $level)
{
    //SQL Insert...
}

}

createUser と insertNewUser は同一ではないため、これが正しい方法であるかどうかわかりません。DRYにするにはどうすれば変更できますか?


コアは単なる PDO 接続クラスであり、すべてのモデルはそこから拡張されます。とにかくその計画です。

abstract class Core {
protected $db ;

function __construct()
{
    try{
        $this->db = new PDO("mysql:host=localhost;dbname=database", "user", "pass") ;
        $this->db->exec('set names utf8') ;
                    $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
        $this->db->setAttribute(PDO::ATTR_PERSISTENT, TRUE) ;
    }
    catch(PDOEXCEPTION $e)
    {
        echo 'Database error: <i style="color:#993300;">'.$e.'</i>' ;
        die() ;
    }
}

function __destruct()
{
    $this->db = NULL ;
}
}
4

1 に答える 1

1

一般に、このシナリオでコードの重複を最小限に抑えたい場合は、各モデルがデータベースの作業を処理しないようにすることをお勧めします。

代わりに、モデルを受け入れて返すモデルごとにゲートウェイを用意できます。通常、単純な検索の場合、クエリの挿入、削除、および更新には大きな違いはありません。すべての共通コードは、他のすべてのゲートウェイの拡張元である AbstractGateway に含めることができます。特定のゲートウェイは、使用するテーブルや返すモデルを定義するなど、モデル固有のものを処理するだけです。

これにより、いくつかの追加の利点も得られます。データベース ゲートウェイを別のストレージ ゲートウェイに簡単に交換できます。そうすれば、データベース接続について心配することなく、コードをテストすることさえできます。

ユーザーメソッドの作成と挿入に関しては、問題はありません。MVC の観点からは、createUser メソッドはコントローラーのメソッドであり、実行中のアクションに対してモデルのメソッドを呼び出します。

于 2012-09-17T13:05:48.193 に答える