繁体   English   中英

如何将Model加载到MVC中的控制器中

[英]How to load Model into a controller in MVC

我正在构建一个轻量级的MVC,主要是为了学习过程,但我希望它最终可以使用。

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

1)我需要从我的Model类中的数据库/缓存/等...获取数据,我只需要帮助我将模型加载到下面的示例控制器中,你可以看到我在下面添加了这个$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);
    }
}

核心

abstract class Core_Controller {
    protected $view;
    protected $model;

    function __construct(DependencyContainer $dependencyContainer){
        $this->view = new Core_View();
        //$this->view = $dependencyContainer->get(view);


    }
}

可能有很多方法可以实现您的目标。

“最简单”可能只是覆盖构造函数并直接实例化模型。

在User_Controller中:

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

    $this->model = new User_Model();
}

我猜你正在寻找一些更自动化的东西。 如果您希望Model与控制器名称相同,而不是“_Controller”,只需在构造函数中使用get_class($ this)并使用PHP的字符串函数来解析您想要的内容。 在变量中具有该变量之后,可以使用该变量来实例化模型:

在Core_Controller中:

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();
}

我实际上没有使用任何只能有一个模型与每个控制器关联的框架(除了CakePHP之外?我不记得了)。 使用Symfony,模型和控制器完全分离,因此您可以将任何模型与任何控制器一起使用。 您只需根据需要实例化模型。 Symfony使用Doctrine ORM,例如,在控制器操作中,如果您需要模型,您可以执行以下操作:

$model = Doctrine::getTable('User');

为了促进解耦设计,可能值得考虑更像这样的设计,并且我保证在某些时候你会想要在某个控制器中使用多个模型。

2.)至于认证。 似乎相当常见的一种方法是使某种设置(无论是在配置文件中还是在成员变量中)说明当前操作是否需要用户进行身份验证。 每次动作运行时都会对此进行处理(Yii称这些事物为过滤器)。 如果用户需要登录,则会存储他们尝试访问的页面,然后将其重定向到登录页面(您只需要创建一个)。 一旦他们正确地进行身份验证,它就会将它们重定向回原来的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM