2

問題の概要

私が作成している MVC フレームワークでのルーティングに小さな問題があります。コードは機能するはずですが、要求された uri を配列に分割して文字列変数に割り当てる方法にどこか問題があります。最初に発生したすべてのエラーを排除したので、コントローラーのインスタンス化に進みました。これが得られたものです。

エラーログ

Class name must be a valid object or a string in /home2/canforce/public_html/index.php on line 23

index.php

//analyze request
$request = new Request(); //breaks up the uri into an array

//routing
$router = new Router(array($request)); //routes the requested uri
$router->route();

//instancialize and execute the controller
$controller = new $router->getController();
$method = $router->getMethod();
$controller->$method();

Request.php

class Request {
public function __construct() {
    //separates the uri into an array
    $uri = explode('/',$_SERVER['REQUEST_URI']);
    $uri = array_filter($uri);

    //stores the requested controller from the uri
    if($uri[0]!="") {
        $request['controller'] = $uri[0];
    }
    else {
        $request['controller'] = "home";//defaults to home
    }

    //stores the requested method from the uri
    if(isset($uri[1])) {
        $request['method'] = $uri[1];
    }
    else {
        $request['method'] = "index";//defaults to index
    }

    //stores the requested arguments in array form
    $count = count($uri);
    $j=0;
    for($i=2;$i<$count;$i++) {
        $request['args'][j] = $request[i];
        $j++;
    }

    return($request);
    }
}

Router.php

class Router {
private $language = NULL;
private $controller;
private $view;
private $method;
private $args = NULL;
public function __construct($request) { //given the requested uri in array form, stores it in local variables
    $this->controller = $request['controller'];
    $this->method = $request['method'];
    $this->args = $request['args'];
}
public function route() { //put the requested uri into forms we can deal with

}
public function getLanguage() {
    return $this->language;
}   
public function getController() {
    return $this->controller;
}   
public function getView() {
    return $this->view;
}
public function getMethod() {
    return $this->method;
}
public function getArgs() {
    return $this->args;
}
}



どんな助けでも大歓迎です!

4

2 に答える 2

2

Requestあなたが抱えている問題は、 のプロパティをに割り当てようとしている方法が原因ですRouter

$router = new Router(array($request));

ここでは、Router に引数を 1 つの要素を持つ配列として指定しています。Requestインスタンス。array にキャストしていません。それが意図だったのかどうかはわかりません。Requestこのため、配列表記 ( など)のプロパティにアクセスすることはできません$request['controller]

そのままでは、パラメータを正しく割り当てるRouterように変更する必要があります。Router::__construct()例えば

public function __construct($array) 
{
    $request = $array[0]; 
    $this->controller = $request->getController(); // No longer using array notation
    $this->method = $request->getMethod();         // such as $request['method']
    //...
}

また

リクエスト引数をラップする不要な配列を削除し、コンストラクターで引数の型ヒントを指定します。

$router = new Router($request);

// Router.php
public function __construct(Request $request) 
{
  $this->controller = $request->getController(); // No longer using array notation
  $this->method = $request->getMethod();         // such as $request['method']
  //...
}

また、新しいインスタンスを作成する前に、クラス名の文字列を保存する必要があります。

$className = $router->getController();
$controller = new $className;
于 2013-08-13T00:01:21.227 に答える