DbTable/Mapper/Model アプローチを使用して、パブリック ライブラリ アプリケーションを大まかにカプセル化するために、Zend Framework で単純な ORM を作成しています。ただし、ユーザー関連のクラスを実行している方法が正しいかどうかはわかりませMapper_User
んModel_User
。
Mapper_User
<?php
class Mapper_Users {
/*
createModelObject would be called by a Controller handling a Form_Regsiter's
data, to create a new Model_User object. This object'd then be saved by the
same Controller by calling Mapper_Users->save();
*/
public function createModelObject(array $fields) {
if(!isset($fields['date_registered']))
$fields['date_registered'] = date('Y-m-d H:i:s');
if(!isset($fields['max_concurrent_rentals']))
$fields['max_concurrent_rentals'] = 3;
return new Model_User($fields);
}
}
?>
新しいModel_User
オブジェクトを最初から作成する方法 (DB からレコードを取得するのではなく、新しいユーザーを登録する場合など) ではModel_User
、フォームから提供された名前/ユーザー名/パスワードを使用して新しいオブジェクトをインスタンス化し、いくつかのオブジェクト プロパティを設定します。登録日、「一度に許可される最大書籍数」など。Model_User
このデータは、によって内部に詰め込まれ、呼び出されたMapper_User
ときに DB に書き込まれます。Mapper_User->save();
マッパーは、これを行うのに適した場所のように感じます-モデルを軽く保ちます。
これは正しいですか、それともこのようなデフォルトのフィールドを内部に設定する必要がありますModel_User
か?
モデル_ユーザー
<?php
class Model_User {
public function setPassword($value) {
$this->password = md5($value);
}
}
?>
ユーザー オブジェクトのパスワードを設定するときは、ご想像のとおり、このメソッド内でこれModel_User->setPassword($value);
を行っています。繰り返しますが、これは正しいと感じます。メソッド$this->password = md5($value);
で md5 ステップを実行しようとすると、パスワード フィールドが明らかに既にハッシュされているため、DB からプルされた場合に問題が発生します。Mapper_User->save();
Model_User
そして、これが私の混乱の原因です。私の考えでは、「ユーザーに関係するフィールド」に関連するすべてのロジックは、そのモデルまたはそのマッパーに存在する必要がありますが、ここでは、マッパーにいくつかのロジック (デフォルト フィールド) と、いくつかの (フィールド操作) があります。モデル。これは正しいですか、それともモデルのデフォルト フィールドまたはマッパーのフィールド操作を何らかの方法で取得しようとする必要がありますか?
これを読んでくれてありがとう!
@RockyFordの編集:
Mapper_User
500 個のファイルに同じ基本的なコードを書くのは好きではないので、実際に私が書いた Abstract を拡張しMapper_*.php
ます。そのため、多少の官僚主義がありますが、その効果的な__construct() は非常に単純です。
<?php
class Mapper_Users {
public function __construct() {
$this->_db = new DbTable_Users();
if(!$this->_db instanceof Zend_Db_Table_Abstract)
throw new Exception('Invalid table data gateway provided');
}
}
?>