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

Jas*_*vis 5 php oop model-view-controller controller model

我正在构建一个轻量级的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

核心

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

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


    }
}
Run Code Online (Sandbox Code Playgroud)

gre*_*ghz 2

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

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

在用户控制器中:

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

    $this->model = new User_Model();
}
Run Code Online (Sandbox Code Playgroud)

我猜你正在寻找更自动化的东西。如果你希望模型与控制器同名减去“_Controller”,只需在构造函数中使用 get_class($this) 并使用 PHP 的字符串函数解析出你想要的内容。一旦将其放入变量中,您就可以使用该变量来实例化模型:

在核心控制器中:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

$model = Doctrine::getTable('User');
Run Code Online (Sandbox Code Playgroud)

为了促进解耦设计,考虑一种更像这样的设计可能是值得的,我保证在某些时候您会在某个控制器中需要多个模型。

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