私がこれを説明する方法を知っている最善の方法は、例であるので、ここにPHP-MVCアプリケーションのための私自身の実装の例があります。コントロールをロードする引数を処理するHook::run
関数には十分注意してください。
のindex.php:
<?php
class Hook {
const default_controller = 'home';
const default_method = 'main';
const system_dir = 'system/';
static function control ($name, $method, $parameter) {
self::req(Hook::system_dir.$name.'.php'); // Include the control file
if (method_exists('Control', $method)) { // For my implementation, I can all control classes "Control" since we should only have one at a time
if (method_exists('Control', 'autoload')) call_user_func(array('Control', 'autoload')); // This is extremely useful for having a function to execute everytime a particular control is loaded
return call_user_func(array('Control', $method), $parameter); // Our page is actually a method
}
throw new NotFound($_GET['arg']); // Appear page.com/control/method does not exist, so give a 404
}
static function param ($str, $limit = NULL) { // Just a wrapper for a common explode function
return (
$limit
? explode('/', rtrim($str, '/'), $limit)
: explode('/', rtrim($str, '/'))
);
}
static function req ($path) { // Helper class to require/include a file
if (is_readable($path)) return require_once($path); // Make sure it exists
throw new NotFound($path); // Throw our 404 exeception if it doesn't
}
static function run() {
list($name, $method, $parameter) = (// This implementaion expects up to three arguements
isset($_GET['arg'])
? self::param($_GET['arg'], 3) + array(self::default_controller, self::default_method, NULL) // + array allows to set for default params
: array(self::default_controller, self::default_method, NULL) // simply use default params
);
return self::control($name, $method, $parameter); // Out control loader
}
}
class AuthFail extends Exception {}
class UnexpectedError extends Exception {}
class NotFound extends Exception {}
try {
Hook::run();
}
catch (AuthFail $exception) { // Makes it posssible to throw an exception when the user needs to login
// Put login page here
die('Auth failed');
}
catch (UnexpectedError $exception) { // Easy way out for error handling
// Put error page here
die('Error page');
}
catch (NotFound $exception) { // Throw when you can't load a control or give an appearance of 404
die('404 not found');
}
システム/ home.php:
<?php
class Control {
private function __construct() {}
static function autoload() { // Executed every time home is loaded
echo "<pre>Home autoload\n";
}
static function main ($param='') { // This is our page
// Extra parameters may be delimited with slashes
echo "Home main, params: ".$param;
}
static function other ($param='') { // Another page
echo "Home other, params:\n";
$param = Hook::param($param);
print_r($param);
}
}
.htaccessファイル:このhtaccessのファイルを使用して
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?arg=$1 [QSA,L]
、私たちは家をロードすることができます.phpコントロールlocalhost/home/main
を使用します。それがなければ、私たちのURLはlocalhost/index?args=home/main
のようになります。
デモスクリーンショット1(ローカルホスト/ simple_mvc /ホーム/メイン/ args1/args2/args3):あなたは、常に特定の制御方法が理由である、期待しようとしているどのように多くの引数を知らない
私はスラッシュで区切られた単一の引数を渡すことが最善であると信じています。制御メソッドが複数の引数を必要とする場合、提供されたHook::param
関数を使用してさらに評価することができます。
デモスクリーンショット2(ローカルホスト/ simple_mvc /ホーム/その他/ args1/args2/args3):
あなたの質問に答えるために:
を本当にあなたの質問に答えるのに役立ちますここで重要なファイルがありますファイルは、localhost/these/types/of/urls
を透過的にlocalhost/index.php?args=these/types/of/urls
のように変換します。そうすれば、explode($_GET['args'], '/');
を使って引数を分割することができます。
この件に関する大きなビデオチュートリアルはhereです。それは本当に多くを説明するのに役立ちます。
私はあなたがリフレクション(http://www.php.net/manual/en/reflectionfunctionabstract.getparametersを使用することができ、最新の編集
でhome.phpとのindex.phpにいくつかの変更を加えました。 php)を使って各メソッドのパラメータを取得します。しかし、私はあなたのコードの多くを見ていないので、私はあなたのMVCの構造がどのようなものか分かりません。私のフレームワークでは、 'call_user_func_array()'を使ってメソッドをディスパッチし、引数を配列として提供するディスパッチャを持っています。 – F21
私は、ある程度前からPHP MVCをセットアップしている[this](http://www.youtube.com/watch?v=Aw28-krO7ZM)ビデオチュートリアルを発見しました。これまでに6つの部品があり、すべてが次の部品に委ねられています。だから、いつでも好きな場所で止めることができますし、それでもたくさんのことができます。今、あなたが求めていることのための非常に良いチュートリアルです。 – Shea
ありがとう、私はリフレクションクラスはちょうど私が探していたものだと思うし、チュートリアルのおかげで私はそれらをチェックアウトするでしょう! – Rain