【问题标题】:When should the Controller get instantiated?什么时候应该实例化控制器?
【发布时间】:2013-01-16 03:38:13
【问题描述】:

我正在构建一个 AJAX Web 应用程序,后端使用 PHP。我正在尝试设计一个路由系统,让我可以轻松地放入新页面,并让我专注于 Javascript。 PHP 将提供的实际页面很简单,只是本质上是 Javascript 图表容器的视图(使用 d3.js 构建)。因此,在我开始进行 AJAX 调用之前,我的控制器甚至不必与我的模型进行交互。

我是 OOP 的新手,尤其是在后端。我一直在用 Javascript 做一些事情,但是对于将 OOP 与 MVC 结合并解决路由问题我是全新的。我知道那里有编写路由类的模块/插件,但是由于这个项目的后端部分非常简单 - 本质上,如何最好地在博客上提供“关于”页面 - 我想借此机会亲自深入学习。

我有一个控制器:

<?php
//controller.php
include 'views/view.php';

class Controller
{

    public function homeAction() {
        $view = new View();
        $view->setTemplate('views/home.php');
        $view->render();
    }

    public function categoryAction($category) {
        $view = new View();
        $view->setTemplate("views/Monitor/{$category}/{$category}.php");
        $view->setCategory($category);
        $view->render();
    }

    public function monitorAction($category, $monitor) {
        $view = new View();
        $view->setTemplate("views/Monitor/{$category}/{$monitor}.php");
        $view->setCategory($category);
        $view->setMonitor($monitor);
        $view->render();
    }

}

?>

现在,我在index.php 的开头实例化我的控制器:

<?php
// Load libraries
require_once 'model.php';
require_once 'controller.php';

$controller = new Controller();

$uri = str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']);

// home action
if ($uri == '/') {
  $controller->homeAction();

// /{category}/{monitor}
} elseif (preg_match("#/(.+)/(.+)#", $uri, $matches) ) {
  $category = $matches[1];
  $monitor  = $matches[2];
  $controller->monitorAction($category, $monitor);

// /{category}
} elseif (preg_match("#/([^/.]+)#", $uri, $matches) ) {
  $category = $matches[1];
  $controller->categoryAction($category);

// 404  
} else {
    header('Status: 404 Not Found');
    echo '<html><body><h1>Page Not Found</h1></body></html>';
}



if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && (!empty($_GET)) && $_GET['action'] == 'get_data') {

    $function = $_GET['chart'] . "_data";
    $dataJSON = call_user_func($function);
    header('Content-type: application/json');
    echo $dataJSON;

}

?>

我已经阅读了一些关于 PHP 的自动加载器的信息,但我想先手动下载它,因为我想确保并了解基本原理。

这是实例化我的Controller 对象的合适位置吗?

【问题讨论】:

  • 你能解释一下这个问题吗?它是一个什么样的应用程序?

标签: php oop model-view-controller


【解决方案1】:

首先,您的架构面临一些重大问题。您需要一个路由器来处理用户请求的 URI,接下来您需要系统的初始化状态。创建Controllers 的常用方法是extend 一个父类,然后在您的父类__construct 方法中您可以初始化您的子控制器,但是,您的系统状态不佳。

这是我永远不会删除的黄金链接:

http://johnsquibb.com/tutorials/mvc-framework-in-1-hour-part-one

【讨论】:

  • 不幸的是,您的“黄金链接”包含非常糟糕的做法和建议。此外,其中没有 MVC。只是另一个类似 Rails 的烂摊子。
  • 我希望得到一些指导。我似乎无法找到关于这些东西的确切信息来源。
  • @tereško,这篇文章已经很老了,但是有一些关于完成 MVC 项目的好做法。控制器部分是一个很好解释的部分,对于初学者来说,它确实有一些好东西。当然,现代 MVC 与旧的 MVC 有很大不同,但这是学习一些东西的问题。
  • 嘿......控制器部分是最错误的部分之一。那篇文章建议将应用程序和 UI 逻辑都转储到所述控制器中,这完全违反了 MVC 的基本概念。你基本上以“控制器做一切”+ 美化的 ORM + 愚蠢的模板结束。那不是 MVC。
  • @tereško,你说得对。没有加载视图、使用模型作为模板以及许多其他空白,但至少有一个关于编写控制器的示例。而且我没说按照这篇文章来创建MVC系统!
猜你喜欢
  • 2023-03-08
  • 2016-01-31
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2011-05-31
  • 1970-01-01
相关资源
最近更新 更多