モデルへの ACL の実装に関する Matthew Weier O'Phinney の投稿の多くを読んで、私はこれを実行する最善の方法に焦点を当ててきました。ただし、ドメイン オブジェクトのベスト プラクティスをさらに調査した結果、これらのモデルにはデータ マッパーや CRUD 操作への参照を含めるべきではないことがわかりました。
たとえば、在庫を維持し、販売注文と購入注文に基づいて企業との間の出荷を処理する ERM ソフトウェアを考えてみましょう。いくつかのドメインがあると思います...
- 会社
- 出荷
- 注文
- 製品
- 組み立て
- そして、いくつかの他の
会社はさまざまなタイプ (メーカー、サプライヤー、小売業者など) を持つことができるため、この情報はデータベース全体の多数のテーブル (会社、タイプ、company_types など) に保存されます。したがって、各データベース テーブルの Zend_Db_Table インスタンスのオブジェクトを使用する会社ドメイン用の Data Mapper があります。
私のコントローラー アクションでは、ロジックはほとんど必要ないことを理解しています。たとえば、新しい会社を作成すると、次のようになります...
public function createAction()
{
// Receive JSON request from front end
$data = Zend_Json::decode($request);
$companyObj = new App_Model_Company();
$companyObj->populate($data);
$companyMapper = new App_Model_DataMapper_Company();
$companyMapper->save($companyObj);
}
これを念頭に置いて、ACL チェックを DataMapper に組み込み、検証をドメイン オブジェクトに組み込むのが最善だと思います。__set
私のドメイン オブジェクトはすべて、PHP のマジックと__get
メソッドをオーバーロードする基本抽象クラスから拡張されます。各ドメイン オブジェクトのコンストラクターで、$_properties
配列にキーを入力してオブジェクトのプロパティを定義します。このように、私の__set
方法は次のようになります...
public function __set($property, $value)
{
$className = __CLASS__;
if(!array_key_exists($property, $this->_properties))
{
throw new Zend_Exception("Class [ $className ] has no property [ $property ]");
}
// @return Zend_Form
$validator = $this->getValidator();
/*
* Validate provided $value against Zend_Form element $property
*/
$this->properties[$property] = $value;
}
}
すべてのデータ マッパーのsave()
メソッド typehint App_Model_DomainObjectAbstract $obj
.
質問 #1 - 私の Data Mapper はすべての CRUD アクションを処理し、Domain オブジェクトには実際にはそのドメインに固有のプロパティのみが含まれている必要があるため、ACL チェックは Data Mapper に属しているように感じます - これは受け入れられますか?
コントローラーで Data Mapper をインスタンス化することを避けようとしていましたが、この設計パターンをよりよく理解していると思うと、これは不合理に思えます。
質問 #2 - このプロセスを複雑にしすぎていませんか? 代わりに、メソッドZend_Controller_Plugin_Abstract
内の着信要求に基づいて ACL を拡張および処理する ACL プラグインを作成する必要がありますか?preDispatch()
お時間をいただきありがとうございました!