Php 使用MVC帮助将模型放入我的控制器

Php 使用MVC帮助将模型放入我的控制器,php,model-view-controller,model,Php,Model View Controller,Model,一段时间以来,我一直在为自己的学习体验构建图书馆/框架。MVC是我花了一段时间才真正理解的东西之一,但我最终还是“明白了” 下面是PHP中基本MVC设置的一些示例代码。到目前为止,我认为我的方向是正确的,我需要一些帮助,在靠近底部的“示例控制器”中,您将看到我可以在哪里创建视图,我只需要找出如何最好地将数据从模型文件获取到该控制器类中。如果可以的话,请用示例代码帮助我,希望我能理解 此外,我也欢迎对任何守则提出任何意见/建议 抽象控制器类。。。 /** * MVC Example Projec

一段时间以来,我一直在为自己的学习体验构建图书馆/框架。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);


    }

}
抽象模型类

/**
 * 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);
    }
}
?>

您会使用数据访问层(DAL)/对象关系映射(ORM)吗?看看,或者

我想说的是,您缺少了应用程序中操纵模型的部分。它可能是你的控制器,但不是一个好的做法。所以我们需要一个模型映射器

从控制器获取模型数据的最佳方法就是调用它。但通常我们使用一种“指针”,它知道如何填充对象模型。此指针称为“映射器”():

此函数将执行数据库查询,并用数据填充一个特定模型。例如,您还可以为“列表”操作获取对象数组

然后将此模型传递给视图

我想你应该看看Zend Framewok快速入门。它会给你一些想法


也请看这个问题:

我的建议是根本不要将视图和模型绑定到控制器。让它们可以从控制器代码实例化,就像任何其他类一样。然后,您可以以标准的面向对象方式获取模型数据(并将其传递给视图)。

那么,Zend Framework、CakePHP和Symfony这样做是错误的吗?=]不,他们没有错。这只是一个不同的观点和偏好:灵活与严格。我认为这是最好的选择,而不仅仅是“严格”。如果你正在构建一个web应用程序,如果你使用“灵活”的方式,你会在同一个视图实例化中一遍又一遍地重复你的自我。这就是大多数被广泛采用的框架不这样做的原因。但是你不能有嵌套视图功能,视图可以被认为是容器而不是容器,就像包含面板/框架的表单一样。这就是为什么我更喜欢灵活的方式,因为我不需要重复doctype、title、菜单等(但它们仍然可以参数化,例如突出显示活动菜单)这不适用。您可以执行相同的操作,并将视图绑定到控制器。实际上,这是上述框架中的一个常见特性。不同的概念。+1我认为为学习目的构建内部框架始终是一个好的做法。我从中学到了很多。您好,我不打算使用DAL或ORM。我试图决定在哪里包括/实例化模型对象,可能在我的核心控制器类中?或者在我的core_controller类中创建一个loader方法,然后在像user_controller这样的实际控制器中,我可以调用loader方法并将模型的名称传递给控制器中的loadeyes。但您必须填充这些模型。这不是一个很好的实践,用一个控制器方法来完成这一切。即使您不使用ORM和DAL,我也建议您使用数据映射器。因此,您将从控制器调用映射器,这些映射器将填充您的模型并将其返回给控制器。类似于:
Core\u DataMapper
以及
getUserById($id)