PHP file_exists返回false

时间:2012-09-08 16:38:07

标签: php url-routing file-exists

我正在尝试为我的项目编写自己的小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')
    );

}

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

  

Controller PagesController缺失

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

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

因此,使用if(file_exists('controllers/' . $controller . '.php'))中的app.php,它应该能够找到controllers/Pages.php,但它不能。{/ p>

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分: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';