And*_*rew 9 php zend-framework model
我对面向对象编程比较陌生.我非常理解这些概念,但实际上,我很难找到有关如何在我的Zend Framework应用程序中最好地使用模型的信息.
具体来说,我有一个不使用数据库表的模型(不扩展任何东西).它使用getter和setter来访问其受保护的成员.我发现自己正在努力学习如何在视图中最好地展示这个模型.我在视图模板中不需要逻辑,但我发现自己处于以下情况:
在我的控制器中:
$object = new Object();
$object->setName('Foo Bar');
$this->view->object = $object;
Run Code Online (Sandbox Code Playgroud)
在我的视图模板中:
<h2><?= $this->object->getName() ?></h2>
Run Code Online (Sandbox Code Playgroud)
我真的不喜欢在我的视图模板中调用函数,但我不知道更好的方法.我不希望我的模型成员公开,但我基本上想要达到相同的结果:
<h2><?= $this->object->name ?></h2>
Run Code Online (Sandbox Code Playgroud)
我不希望我的控制器完成所有关于模型的所有工作:
$object = new Object();
$object->setName('Foo Bar');
$this->view->object = $object;
$this->view->object->name = $object->getName();
Run Code Online (Sandbox Code Playgroud)
在Zend Framework中使用模型的最佳实践是什么?任何人都可以推荐任何可以帮助我理解Zend Framework中的模型/视图困境的教程吗?
一种可能性是使用 PHP 中神奇的 __set 和 __get 方法。我在我的抽象 Model 类中像这样使用它们:
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.
}
}
Run Code Online (Sandbox Code Playgroud)
这使得您可以根据需要为属性指定 getter 和 setter,但也使得您不必为每个属性定义样板函数,而只需为您想要在返回之前对其进行某种处理的属性定义样板函数。价值。例如,我在很多地方使用该功能将符合 ISO 的日期(存储在 MySQL 中)更改为更紧凑且用户可读的格式。
至于在控制器中放置什么,我建议您查看这篇文章,以获取有关在控制器中放置什么处理的一些具体反馈。
有些人觉得他们宁愿有一个助手,可以自动将模型加载到视图中并完全绕过控制器。我个人认为,在 Zend Framework 和 PHP 的上下文中,将模型从控制器传递到视图中是很有意义的,因为视图中模型的状态经常取决于来自请求的内容(这绝对应该被处理)在控制器中)。
更新:根据评论中的批评,我要指出的一件事是,数据库访问层和域(或模型)层实际上是两个不同的东西,尽管使用 Active Record 将它们混合在一起。我不久前问过这个问题,并收到了一些关于此事的有用反馈。无论您决定如何处理模型,您都需要为所有域对象提供一致的 API,无论模型的数据来自何处。
我认为 Saem 的答案提供的一个好处是它提供了将属性/函数返回值从一个或多个域对象直接映射到视图对象的能力。理论上,视图中的用法如下所示:
// Mapped from Model_User::_data->last_name and Model_User::_data->first_name
$this->name
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9091 次 |
| 最近记录: |