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')
    );

}

ルートディレクトリ()をロードしようとすると、次の/ようになります。

コントローラPagesControllerがありません

何らかの理由で、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 に答える