Controller什么时候应该实例化?

时间:2013-01-31 21:57:32

标签: php oop model-view-controller

我正在构建一个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对象的适当位置吗?

1 个答案:

答案 0 :(得分:1)

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

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

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