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

时间:2011-09-07 02:12:45

标签: php oop model-view-controller model controller

我正在构建一个轻量级的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);


    }
}

1 个答案:

答案 0 :(得分:2)

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

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

在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称这些事物为过滤器)。如果用户需要登录,则会存储他们尝试访问的页面,然后将其重定向到登录页面(您只需要创建一个)。一旦他们正确地进行身份验证,它就会将它们重定向回原来的位置。