PHP MVC渲染主页

时间:2012-07-10 07:58:41

标签: php model-view-controller module structure partial-views

我正在尝试学习Web应用程序的MVC设计模式,所以我决定编写自己的PHP MVC框架。在写这篇文章之前,我读了很多关于MVC的教程和论坛。现在我非常了解MVC的想法,以及如何沟通控制器模型视图。我写了路由器和几个模块(登录,类别,......) - 似乎它正在工作。

现在我有点困惑:

如果我拨打localhost/LogIn,我只会收到登录表单,如果我拨打localhost/categories我会收到类别列表。一切都还好,但我想创建索引控制器,并在调用localhost/index时,我想查看登录表单,类别和更多模块。

我应该从indexController.php呼叫控制器(登录,类别)吗?

我需要建议如何在一个页面中连接所需的模块。

3 个答案:

答案 0 :(得分:0)

不,控制器不应该调用彼此的功能。一些框架引入了“helpers”来实现您的需求。

控制器可以使用相同的模型,并且视图无论如何都会有所不同,因此您可以使用类别模型为您提供要显示的类别(例如$ categories-> getCategoriesList()),然后在类别控制器中使用它视图以及索引控制器视图。

从另一个控制器调用一个控制器的合法方法是通过形成HTTP请求 - 例如接收HTML片段(另一个控制器渲染视图),通过AJAX或使用指向另一个控制器的源的iframe显示在视图中(这是一个笨拙的解决方案,主要用于想法说明)。

答案 1 :(得分:0)

你需要几件事:

  1. 您需要一个.htaccess文件,该文件会导致所有请求都通过索引文件,这里只是一个简单的文件:

    RewriteEngine On
    RewriteBase /demo
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    
    RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
    
  2. 在index.php文件中,您需要设置包含路径,因此您不必显式包含模块/控制器/视图或您选择的任何其他类:

     define("APPLICATION_PATH", realpath('.'));
     $paths = array(
        APPLICATION_PATH.'/controllers',
        APPLICATION_PATH.'/models',
        APPLICATION_PATH.'/views',
        APPLICATION_PATH.'/libs',
        APPLICATION_PATH.'/includes',
        get_include_path()
    );
    
    set_include_path(implode(PATH_SEPARATOR, $paths));
    
  3. 现在为自动加载类添加'魔术方法'(自动调用)并初始化你的Bootsrap类:

    function __autoload($className){
    $fileName = str_replace('\\','/', $className);
    require_once "$fileName.php";
    }
    new Bootstrap();
    
  4. bootstrap.php中:

    <?php
    class Bootstrap {
    
        public function __construct() {
    
            $url = $_GET['url'];
    
            $params = explode('/', $url);
    
            //if controller exist - call it, else call login controller
            if (isset($params[0]) && $params[0]){
                $controller = new $params[0]();
            }
            else{
                $controller = new login();
            }
    
            //if method exist - call it, else call index method
            if (isset($params[1]) && $params[1]){
    
                //if parameter exit - call method with param, else call witout param
                if (isset($params[2]) && $params[2]){
                    $controller->$params[1]($params[2]);
                }
                else{
                    $controller->$params[1]();
                }
            }
            else{
                $controller->index();
            }
        }
    }
    
  5. 那应该给你一个基本的MVC框架。

答案 2 :(得分:0)

使用您的控制器(index.php)集中在每个页面上使用的代码(请求验证程序,错误句柄,异常处理程序,会话内容)。

创建一个Router类以获取正确的模型。允许模型获得正确的视图。我在其他答案(https://stackoverflow.com/questions/42172228/is-this-how-an-mvc-router-class-typically-works)中包含了一些UML图表以帮助解决问题。请记住,尝试编程为抽象接口,而不是具体实现。

Router UML Diagram

Model UML Diagram