0

名前空間を利用するようにディスパッチャーを変更しています。

私のオートローダーは非常に標準的で、次のようになっています。

$paths = array(
get_include_path(),
ROOT . DS . 'library'  . DS . 'intranet'  . DS  . 'classes',
ROOT . DS . 'application',
);

set_include_path(join(PATH_SEPARATOR, $paths));
spl_autoload_register();

私のルーターは少し混乱していますが、これまでのところ、

$url = explode('/', trim($_SERVER['REQUEST_URI'], '/'));

    $controller = !empty($url[0])  ? 'controller\\'.$url[0]  : 'controller\\home';
    $method = !empty($url[1]) ? $url[1] : 'index';
    $params = !empty($url[2]) ? $url[2] : $_POST;


    if (class_exists($controller)){

        $dispatchedController = "new $controller()";

        if (! method_exists($controller, $method)){
            trigger_error("{$controller}::{$method}() Method does not exist!");
            $error = new ErrorHandler();
            $error->invalidDispatch(debug_backtrace(),$controller, $method);
            return;
        }

        return $dispatchedController::$method;

    } else{
        trigger_error("{$controller}::{$method}({$params}) Method does not exist!");
        $error = new ErrorHandler();
        $error->invalidDispatch(debug_backtrace(), $controller, $method);
        return;
    }
}

ただし、失敗し続けますreturn $dispatchedController::$method;

たとえば、クラスファイルを見てみましょうhome:

名前空間コントローラー;

class home
{
    public function index(){

    echo "cool!";
    }
}

エラーが発生しています:Fatal error: Class 'new controller\home()' not found in /public/library/intranet/classes/router.php on line 30

ディスパッチャを変更するにはどうすればよいですか?

4

1 に答える 1

0

コードを次のように変更して、コントローラー オブジェクトを作成する必要があります。

$dispatchedController = new $controller;

次に、メソッドを callable として返すことができます。

return array($dispatchedController, $method);

その後、これを呼び出すことができます

call_user_func($returnedValue); // and also with call_user_func_array
于 2012-11-21T00:03:06.023 に答える