0

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

现在我有点困惑:

如果我打电话localhost/LogIn,我只会得到登录表格,如果我打电话,localhost/categories我会得到类别列表。一切正常,但我想创建索引控制器,并且在调用时localhost/index我想查看登录表单、类别和更多模块。

我应该调用控制器(登录名、类别)indexController.php吗?

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

4

3 回答 3

0

不,控制器不应该调用彼此的函数。一些框架引入了“助手”来实现你所需要的。

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

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

于 2012-07-10T08:11:46.007 回答
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. 引导程序.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();
            }
        }
    }
    

那应该给你一个基本的 MVC 框架。

于 2012-07-10T08:19:30.190 回答
0

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

创建一个路由器类以获取正确的模型。允许模型获得正确的视图。我已经从我的其他答案( https://stackoverflow.com/questions/42172228/is-this-how-an-mvc-router-class-typically-works )中包含了一些 UML 图来提供帮助。请记住,尝试编程到抽象接口,而不是具体实现。

路由器UML图

模型 UML 图

于 2017-02-14T16:30:29.390 回答