我一直致力于自己的图书馆/框架学习体验。 MVC是我花了一段时间才能真正理解的东西之一,但我终于“搞定了”。
下面是PHP中基本MVC设置的一些示例代码。到目前为止,我认为我正朝着正确的方向前进,在底部附近的“示例控制器”中我需要一些帮助,你会看到我可以在哪里创建一个视图,我只需要弄清楚如何最好地获取我的从模型文件到该控制器类的数据。如果可以,请帮助您提供示例代码,希望我有意义。
我也欢迎任何有关任何代码的意见/建议
抽象控制器类......
/**
* MVC Example Project
*/
/**
* Extend this class with your Controllers
* Reference to the model wrapper / loader functions via $this->model
* Reference to the view functions via $this->view
*/
abstract class Core_Controller {
protected $view;
protected $model;
function __construct($dependencyContainer){
$this->view = new Core_View();
//$this->view = $dependencyContainer->get(view);
}
}
抽象模型类......
/**
* Extend this class with your models and reference to the database object via $this->$db
*/
abstract class Core_Model {
protected $db;
protected $session;
function __construct($dependencyContainer) {
$this->db = $dependencyContainer->get(database);
$this->session = $dependencyContainer->get(session);
}
}
查看类,也可以使它抽象化......
class Core_View {
protected $data;
# Load a view file (views/$view.php);
# $param data this gets extracted and be thus be used inside the view
# When loading another view from inside the view file the data is 'cached' so you
# don't have to pass them again
public function load($view,$data = null) {
if($data) {
$this->data = $data;
extract($data);
} elseif($this->data != null) {
extract($this->data);
}
require(APP_PATH . "Views/$view.php");
}
public function set($data = null) {
if($data) {
$this->data = $data;
extract($data);
} elseif($this->data != null) {
extract($this->data);
}
}
}
将它放在一起的例子......
/**
* Example Controller
*/
class User_Controller extends Core_Controller {
public function profile()
{
$profileData = array();
$profileData = //GET from Model
$this->view->load('userProfile', $profileData);
}
}
?>
答案 0 :(得分:2)
我的建议是不要将视图和模型与控制器联系起来。让它们可以从控制器代码中实例化,就像任何其他类一样。然后,您可以以标准面向对象的方式获取模型数据(并将其传递给视图)。
答案 1 :(得分:1)
您会使用数据访问层(DAL)/对象关系映射(ORM)吗?请查看Zend_Db,Doctrine或Propel
我会说你错过了操纵模型的应用程序部分。它可能是你的控制器,但不是一个好习惯。所以我们需要一个模型映射器。
从控制器获取模型数据的最佳方法就是调用它。但通常我们使用一种知道如何填充对象模型的“指针”。该指针称为“Mappers”(Data Mapper Pattern):
$MyModelMapper = new MyModelMapper();
$Profile = $MyModelMapper->getProfileById($id); // return Core_Model.
此函数将执行数据库查询,并使用数据填充一个特定模型。例如,您还可以获取“列表”操作的对象数组。
然后您将此模型传递给您的视图。
我认为你应该看一下Zend Framewok的快速入门。它会给你一些想法。