Прочитав множество постов Мэтью Вейера О'Финни о внедрении ACL в модели, я сосредоточился на том, как лучше всего это сделать. Однако после дальнейшего изучения передовых методов работы с объектами домена я понимаю, что эти модели не должны содержать никаких ссылок на Data Mappers или какие-либо операции CRUD.
Возьмем, к примеру, программное обеспечение ERM, которое ведет инвентаризацию и обрабатывает поставки в / из компаний на основе заказов на продажу и покупку. Я представляю себе несколько доменов ...
- Компания
- Отгрузка
- Заказ
- Продукт
- сборка
- И еще несколько
Поскольку компании могут иметь разные типы (например, производитель, поставщик, продавец), эта информация хранится в многочисленных таблицах в моей базе данных (например, компании, типы, company_types). Таким образом, у меня есть Data Mapper для моего домена компании, который использует объекты для экземпляров Zend_Db_Table каждой таблицы базы данных.
В своих действиях Контроллера я понимаю, что логики должно быть очень мало. Например, создание новой компании может выглядеть примерно так ...
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, а проверку - в объект домена. Все объекты My Domain выходят за пределы базового абстрактного класса, который перегружает магические методы PHP __set
и __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()
методы моего Data Mapper typehint App_Model_DomainObjectAbstract $obj
.
Вопрос №1. Поскольку мой Data Mapper будет обрабатывать все действия CRUD, а объект Domain должен действительно содержать только свойства, специфичные для этого домена, я чувствую, что проверки ACL относятся к Data Mapper - это приемлемо?
Я пытался избежать создания экземпляров Data Mapper в своих контроллерах, но теперь это кажется нерациональным, поскольку я думаю, что лучше понимаю этот шаблон проектирования.
Вопрос № 2 - Не слишком ли я усложняю этот процесс и должен ли я вместо этого написать подключаемый модуль ACL, который расширяет Zend_Controller_Plugin_Abstract
и обрабатывает ACL на основе входящих запросов в методе preDispatch()
?
Спасибо вам большое за ваше время!