2011-01-07 8 views
2

私は、一般的なユーザーの作成、削除、および変更を管理するユーザークラスを構築しています。私のクラスでは、このように使用する必要があります。ユーザークラス、良いアプローチですか?

# creation 
user::create($username, $password, $email); // Does not need of $id 

# modification 
$u = new user($id); 
$u->edit('password', $new_password); 

# deletion 
$u->delete(); 

は基本的にクラス(静的メソッドを作成含める)obliviously引数として使用されるIDを必要としないこと。作成後、ユーザー情報を収集し、クラスユーザーのインスタンスを作成するユーザーを管理し、ユーザーの$ idを引数として設定できます。 は、その優れたデザインですか私のようなものを作成する必要があります。2つの異なるクラスを作成しています...

# creation 
$users = new genericUserMethod(); 
$users->create($username, $password, $email); 

# modification 
$u = new specificUser($id); 
$u->edit('password', $new_password); 

# deletion 
$u->delete(); 

。それとも他の方法がありますか?

答えて

3

これはアプローチが考えられます。

class User { 
    private $id; 
    private $name; 
    //more fields here 

    public function __construct($id = null) { 
     $this->id = $id; 
     if(!is_null($this->id)) { 
      $this->load_user_data(); 
     } 
    } 

    protected function load_user_data() { 
     //select from DB where id = $this->id and populate fields 
    } 

    public function save() { 
     //if $this->id is null insert the user details in DB and populate $this->id with new user's id 
     //else update DB with field (optionally check what has changed and update only if necessary) 
    } 

    public function delete() { 
     //delete user if $this->id is not null 
    } 

    //fields getters and setters here as needed 

} 

使用サンプル:

$mary = new User(); //fresh new user 
echo $mary->getId(); //returns null as this user is not inserted. 
$mary->setName('mary'); 
$mary->save(); //insert user with name mary in the DB 
echo $mary->getId(); // returns an id as this user is now inserted 

$john = new User(2); // we assume there was a user john in DB with id = 2 
echo $john->getName(); //echoes 'john' if this was his name in DB 

あなたも、例えばアクティブユーザーを持つ配列を返しますgetActiveUsers()ようなクラスの静的メソッドを定義することができます。.. 。

注:ドームコンプリートを行う必要がある場合ORMライブラリを尖らせて使用することをお勧めします。質問は何ですか?

+0

私はそれも好きで、これは過去にしたことです。おそらく、新しいユーザーの作成、古いものの読み込み、削除、エディジットなどの使用法を追加してください... + – ircmaxell

+1

コンストラクタを使用してデータベースから暗黙的にオブジェクトを読み込むことは、「良い設計」ではありません。与えられた$ idがデータベースに存在しないことを示すことはできません。また、コンストラクタは、クラスの新しい有効なインスタンスを作成する目的にのみ役立つ必要があります。 -1 – mschneider

+0

@mschneiderあなたは正しいです、コンストラクタはprotectedとして設定することもできますし、内部的にコンストラクタを呼び出す2つの静的メソッド "create"と "load"を作成することもできます...これは単純なスケルトンとして意図されています... – maid450

2

最初のもの。おそらく、あなたはActiveRecord/ActiveModelを見て、さらにインスピレーションを得るべきでしょう。

2

これを処理する2つの一般的な方法は、Active RecordData mapperです。 Doctrine 1アクティブレコードパターンを使用し、Doctrine 2はデータマッパーを使用します。要するに:
- アクティブなレコードでは、データと永続
の両方を処理するクラスを持っている - データマッパーと永続性

を処理するデータクラスとクラスを持っている。またのいずれかの上に行くことができますData Access Objectパターンがあります上記の通り。

あなたの最初の例は、レコードオブジェクトを構築するために、不合理な静的な省略形を持つアクティブなレコードパターンのように見えます(なぜ新しいコンストラクタがないか、

第2の例は、アクティブなレコードの上にDAOのように見え、より普通に見えます。

関連する問題