【问题标题】:How to load Model into a controller in MVC如何将模型加载到 MVC 中的控制器中
【发布时间】:2011-11-11 19:02:47
【问题描述】:

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

核心

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

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


    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

    在用户控制器中:

    public function __construct(DependencyContainer $dc) {
        parent::__construct($dc);
    
        $this->model = new User_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 将这类事物称为过滤器)。如果用户需要登录,它会存储他们尝试访问的页面,然后将他们重定向到登录页面(您应该只需要创建一个)。一旦他们正确地进行了身份验证,它就会将他们重定向回原来的目的地。

    【讨论】:

    • 感谢您的想法,您说得对,有些控制器很可能需要不止 1 个模型,尤其是在构建社交网络类型的网站时。
    • 是的,上面给出的示例的另一个缺点是您总是实例化模型,即使您可能不需要它。这可能没什么大不了的,但值得注意的是,您可能会在某些请求上做额外的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多