Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在MVC中将模型加载到控制器中_Php_Oop_Model View Controller_Model_Controller - Fatal编程技术网

Php 如何在MVC中将模型加载到控制器中

Php 如何在MVC中将模型加载到控制器中,php,oop,model-view-controller,model,controller,Php,Oop,Model View Controller,Model,Controller,我正在致力于构建一个轻量级MVC,主要是为了学习过程,但我希望它足够好,最终可以使用 下面是一个基本控制器的基本示例/演示,让我们假设URI已被处理并路由到此控制器和这两个方法 1) 我需要从数据库/缓存等获取数据。。。在我的模型类中,我只需要关于如何将模型加载到下面的示例控制器中的帮助,您可以看到我在下面添加了这个$profileData=$this->Model->getProfile($userId),它只是虚构的,并不存在,但我如何才能让类似的东西工作呢?或者我应该以不同的方式将模型加载

我正在致力于构建一个轻量级MVC,主要是为了学习过程,但我希望它足够好,最终可以使用

下面是一个基本控制器的基本示例/演示,让我们假设URI已被处理并路由到此控制器和这两个方法

1) 我需要从数据库/缓存等获取数据。。。在我的模型类中,我只需要关于如何将模型加载到下面的示例控制器中的帮助,您可以看到我在下面添加了这个
$profileData=$this->Model->getProfile($userId)
,它只是虚构的,并不存在,但我如何才能让类似的东西工作呢?或者我应该以不同的方式将模型加载到类中

2) 很多页面都需要用户登录该站点。我是否应该在控制器中处理以下部分以检查用户是否登录,例如,在构建概要文件页面之前,检查用户是否登录,如果没有,则构建登录页面,并将这些检查添加到每个控制器方法/页面中

/**
 * Example Controller
 */
class User_Controller extends Core_Controller {

    // domain.com/user/id-53463463
    function profile($userId)
    {
        //GET data from a Model
        $profileData = $this->model->getProfile($userId);

        $this->view->load('userProfile', $profileData);
    }

    // domain.com/user/friends/
    function friends()
    {
        //GET data from a Model
        $friendsData = $this->model->getFriendlist();

        $this->view->load('userFriends', $friendsData);
    }
}
核心


可能有很多方法可以完成你正在尝试的事情

“最简单的”可能就是重写构造函数并直接实例化模型

在用户控制器中:

public function __construct(DependencyContainer $dc) {
    parent::__construct($dc);

    $this->model = new User_Model();
}
public function __construct(DependencyContainer $dc) {
    $this->view = new Core_View();

    // $model_class should be 'User_Model' now
    $model_class = str_replace('_Controller', '_Model', get_class($this));

    // now instantiate the model
    $this->model = new $model_class();
}
我猜你是在寻找自动化程度更高的东西。如果希望模型的名称与控制器的名称相同,减去“_controller”,只需在构造函数中使用get_class($this),并使用PHP的字符串函数解析出所需的内容。在变量中包含该变量后,可以使用该变量实例化模型:

在Core_控制器中:

public function __construct(DependencyContainer $dc) {
    parent::__construct($dc);

    $this->model = new User_Model();
}
public function __construct(DependencyContainer $dc) {
    $this->view = new Core_View();

    // $model_class should be 'User_Model' now
    $model_class = str_replace('_Controller', '_Model', get_class($this));

    // now instantiate the model
    $this->model = new $model_class();
}
实际上,我没有使用过任何一种框架,这种框架只能有一个与每个控制器关联的模型(除了may CakePHP?我记不起来了)。使用Symfony,模型和控制器完全解耦,因此您可以将任何模型与任何控制器一起使用。您只需根据需要实例化模型。Symfony使用ORM原则,例如,在控制器操作中,如果需要模型,可以执行以下操作:

$model = Doctrine::getTable('User');
也许考虑一个更像这样的设计来促进一个解耦的设计是值得的,并且我保证在某个时候你会想要某个控制器中不止一个模型。
2.)至于身份验证。似乎很常见的一种设置(无论是在配置文件中还是在成员变量中)说明当前操作是否需要对用户进行身份验证。每次操作运行时都会对其进行处理(Yii调用这些类型的过滤器)。如果用户需要登录,它将存储他们试图访问的页面,然后将他们重定向到登录页面(您应该只需要创建一个)。一旦他们正确验证,它会将他们重定向回原来的方向。

谢谢你的想法,你是对的,一些控制器很可能需要不止一个模型,尤其是在构建社交网络类型的网站时。是的,上面给出的示例的另一个缺点是,您总是实例化模型,即使您可能不需要它。这可能没什么大不了的,但值得注意的是,您可能在某些请求上做了额外的工作。