Одна из возможностей - использовать волшебные методы __set и __get в PHP. Я использую их вот так в своем абстрактном классе модели:
abstract class Model_Abstract
{
protected $_data;
// Private Data Members assigned to protected $_data
public function __construct($data = null)
{
// Makes it so that I can pass in an associative array as well as
// an StdObject.
if(!is_object($data)) {
$data = (object) $data;
}
$this->_data = $data;
}
public function __get($key)
{
if (method_exists($this, '_get' . ucfirst($key))) {
$method = '_get' . ucfirst($key);
return $this->$method();
}
else {
return $this->_data->$key;
}
}
public function __set($key, $val)
{
if ( method_exists( $this, '_set' . ucfirst($key) ) ) {
$method = '_set' . ucfirst($key);
return $this->$method($val);
}
else {
$this->_data->$key = $val;
return $this->_data->$key;
}
}
}
class Model_User extends Model_Abstract
{
//Example overriding method for the property firstName in the $_data collection.
protected function _getFirstName()
{
// Do some special processing and then output the first name.
}
}
Это делает так, что вы можете указывать геттеры и сеттеры для свойств по мере необходимости, но делает так, что вам не нужно определять стандартные функции для каждого свойства, а только те, в которых вы хотите выполнить какую-то обработку, прежде чем возвращать ценность. Например, я использую эту функциональность в нескольких местах, чтобы изменить даты, соответствующие ISO (хранящиеся в MySQL), в более компактный и читаемый формат для пользователей.
Что касается того, что разместить в вашем контроллере, я бы рекомендовал посмотреть this post, чтобы получить конкретную информацию о том, какую обработку разместить в вашем контроллере.
Некоторые считают, что они предпочли бы иметь помощника, который автоматически загружает модели в представление и полностью обходит контроллер. Лично я бы сказал, что в контексте Zend Framework и PHP имеет смысл передавать модели в представление из контроллера, потому что состояние моделей в представлении часто зависит от того, что пришло из запроса (который обязательно должен быть обработан. в контроллере).
Обновление: в соответствии с критикой в комментариях, я хотел бы указать на то, что уровень доступа к базе данных и уровень домена (или модели) на самом деле две разные вещи, хотя с Active Record они смешаны вместе. Я задал этот вопрос некоторое время назад и получил несколько полезных отзывов. по этому поводу. Что бы вы ни решили делать с моделью, вы захотите предоставить согласованный API для всех объектов домена, независимо от того, откуда поступают данные для модели.
Я полагаю, что одно из преимуществ, предлагаемых ответом Саема, заключается в том, что он предлагает возможность напрямую отображать возвращаемые значения свойств / функций из одного или нескольких объектов домена в объект представления. Теоретически использование в представлении выглядит так:
// Mapped from Model_User::_data->last_name and Model_User::_data->first_name
$this->name
person
Noah Goodrich
schedule
02.03.2009