1

我正在尝试为我的项目编写自己的小型 MVC 框架,我可以直接加入并快速启动并运行,主要用于学习目的。每个请求都通过index.php具有以下代码的路由:

<?php

// Run application
require 'application/app.php';
$app = new App();
$app->run();

这是我的应用程序类:

<?php

class App {

    public function run() {
        // Determine request path
        $path = $_SERVER['REQUEST_URI'];

        // Load routes
        require_once 'routes.php';

        // Match this request to a route
        if(isset(Routes::$routes[$path])) {

        } else {
            // Use default route
            $controller = Routes::$routes['/'][0];
            $action = Routes::$routes['/'][1];
        }

        // Check if controller exists
        if(file_exists('controllers/' . $controller . '.php')) {
            // Include and instantiate controller
            require_once 'controllers/' . $controller . '.php';
            $controller = new $controller . 'Controller';

            // Run method for this route
            if(method_exists($controller, $action)) {
                return $controller->$action();
            } else {
                die('Method ' . $action . ' missing in controller ' . $controller);
            }
        } else {
            die('Controller ' . $controller . 'Controller missing');
        }
    }

}

这是我的路线文件:

<?php

class Routes {

    public static $routes = array(
        '/' => array('Pages', 'home')
    );

}

当我尝试加载根目录(/)时,我得到了这个:

控制器页面控制器丢失

由于某种原因,该file_exists功能看不到我的控制器。这是我的目录结构:

/application
    /controllers
        Pages.php
    /models
    /views
    app.php
    routes.php

所以通过使用if(file_exists('controllers/' . $controller . '.php'))from app.php,它应该能够找到controllers/Pages.php,但它不能。

有谁知道我该如何解决这个问题?

4

1 回答 1

2

您正在为您的包含使用相对路径。随着您的应用程序的增长,它将成为一场噩梦。

我建议你

  • 编写一个处理包含文件的自动加载器类。使用一些将命名空间/类名转换为路径的映射机制。
  • 使用绝对路径。请参阅下面的调整代码。

例子:

// Run application
define('ROOT', dirname(__FILE__) );
require ROOT . '/application/app.php';
$app = new App();
$app->run();

然后:

// Check if controller exists
if(file_exists(ROOT . '/application/controllers/' . $controller . '.php')) {
    // Include and instantiate controller
    require_once ROOT. '/application/controllers/' . $controller . '.php';
    $controller = new $controller . 'Controller';
于 2012-09-08T16:42:42.687 回答