「ルーティング」という用語を正しく使用しているかどうかはわかりませんが、状況は次のとおりです。
次のように、アプリケーションのURLを「処理」するファイルを作成しました.htaccess
(私の用語が正しいかどうかはわかりません):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
今私はこれを持っています:
http://appname/controller/method/parameter
http://appname/$url[0]/$url[1]/$url[2]
私がしたことは次のとおりです。
- URLで指定されていない場合に備えて、デフォルトのコントローラーをセットアップします
- コントローラーラッパーをセットアップする
私はこのようにそれをやった
$target = new $url[0]()
$controller = new Controller($target)
その問題は、コントローラーのコンストラクターで渡したオブジェクトのメソッドを使用できないことです。
私はこのように解決しました:
class Controller {
protected $target;
protected $view;
public function __construct($target, $view) {
$this->target = $target;
$this->view = $view;
}
public function __call($method, $arguments) {
if (method_exists($this->target, $method)) {
return call_user_func_array(array($this->target, $method), $arguments);
}
}
}
これは正常に機能しています。問題は、ルーティングを行ったインデックスで発生します。ここにあります
if(isset($url[2])){
if(method_exists($controller, $url[1])){
$controller->$url[1]($url[2])
}
} else {
if(method_exists($controller, $url[1])){
$controller->$url[1]()
}
}
どこ$controller = new Controller($target)
問題は、メソッドが存在しないことです。メソッドが存在するかどうかを確認せずに直接使用できますが、どうすればこれを解決できますか?