私はアプローチとして、CodeIgniterや他のMVCフレームワークと似た方法を使用します(しかし単純です)。
だから、最初のスキーマを考案する必要があり、私はそれで意味することは、この
www.yoursite.com/index.php/{controller}/{method}/args ...
その後、あなたはURLを解析行くようにルータを建設するようなものです。私はあなたに1つ書くことができますが、それは分かかるでしょう。
SimpleRouter.php
/**
* A simple 1 level router
*
* URL schema is http://example.com/{controller}/{method}/{args ... }
*
* @author ArtisticPhoenix
* @package SimpleRouter
*/
class SimpleRouter{
/**
* should be the same as rewrite base in .htaccess
* @var string
*/
const REWRITE_BASE = '/MISC/Router/';
/**
* path to controller files
*
* @var string
*/
const CONTOLLER_PATH = __DIR__.'/Controllers/';
/**
* route a url to a controller
*/
public static function route(){
//normalize
if(self::REWRITE_BASE != '/'){
$uri = preg_replace('~^'.self::REWRITE_BASE.'~i', '',$_SERVER['REQUEST_URI']);
}
$uri = preg_replace('~^index\.php~i', '',$uri);
$uri = trim($uri,'/');
//empty url, like www.example.com
if(empty($uri)) $uri = 'home/index';
//empty method like www.example.com/home
if(!substr_count($uri, '/')) $uri .= '/index';
$arrPath = explode('/', $uri);
$contollerName = array_shift($arrPath);
$methodName = array_shift($arrPath);;
$contollerFile = self::CONTOLLER_PATH.$contollerName.'.php';
if(!file_exists($contollerFile)){
//send to error page
self::error404($uri);
return;
}
require_once $contollerFile;
if(!class_exists($contollerName)){
self::error404($uri);
return;
}
$Controller = new $contollerName();
if(!method_exists($Controller, $methodName)){
self::error404($uri);
return;
}
if(!count($arrPath)){
call_user_func([$Controller, $methodName]);
}else{
call_user_func_array([$Controller, $methodName], $arrPath);
}
}
/**
* call error 404
*
* @param string $uri
*/
protected static function error404($uri){
require_once self::CONTOLLER_PATH.'home.php';
$Controller = new home();
$Controller->error404($uri);
}
}
デフォルトのコントローラホーム:
UPDATE
あなたは私のgithubのページhere
にしかし、ここでrefrenceのためにそれを見つけることができるコードです。 PHP
/**
*
* The default controller
*
* @author ArtisticPhoenix
* @package SimpleRouter
*/
class home{
public function index($arg=false){
echo "<h3>".__METHOD__."</h3>";
echo "<pre>";
print_r(func_get_args());
}
public function otherpage($arg){
echo "<h3>".__METHOD__."</h3>";
echo "<pre>";
print_r(func_get_args());
}
public function error404($uri){
header('HTTP/1.0 404 Not Found');
echo "<h3>Error 404 page {$uri} not found</h3>";
}
}
2コントローラ(例えば)user.php
/**
*
* An example users router
*
* @author ArtisticPhoenix
* @package SimpleRouter
*/
class user{
public function index(){
echo "<h3>".__METHOD__."</h3>";
}
public function login(){
echo "<h3>".__METHOD__."</h3>";
}
}
リライト(削除のindex.php)の.htaccess私が行っ
require_once __DIR__.'/SimpleRouter.php';
SimpleRouter::route();
のindex.php最後
RewriteEngine On
# For sub-foder installs set your RewriteBase including trailing and leading slashes
# your rewrite base will vary, possibly even being/if no sub-foder are involved
RewriteBase /MISC/Router/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
ルータにstatic
を呼び出すだけで、単純なものを保つことができます。この方法では、クラスのインスタンスは必要ありません。とにかく2つの方法しかありません。
私はそれがちょうどControllers/user.php
の代わりにControllers/user/home.php
のようなサブフォルダにコントローラを置くことができないということを意味しています。これは中小規模のサイトでは問題ありませんが、大きなサイトが異なる場合は、コントローラをネストすることが望ましい場合があります。しかし、これはそれに複雑さを追加します。
個別にルートを作成するのではなく、この方法の利点は明白です。ルート(URL)が私が概説した単純なスキーマに従う限り、コードに触れる必要はありません。これにより、サイトのセクションを機能別に独自のファイルに編成することもできます。たとえば、user.php
コントローラを使用します。ログイン、プロファイル、ログアウトページなどのすべての機能を1つの場所に置くことができます。
member.php
コントローラを追加する場合は、ログに記録するだけのものをすべて入れることができますそこにユーザがいます。そのコントローラの__construct
メソッドでは、現在のセッションがログインしていて、そのファイルのすべてのメソッドをカバーしているかどうかをチェックします。
URLスキーマはhttp://example.com/{controller}/{method}/{args ... }
です。しかし、このようなURLを使用することもできますhttp://example.com/index.php/{controller}/{method}/{args ... }
。あなたは、あなたがURLにindex.php
を入れて(またはいくつかの他の手段でそれを削除)する必要があることはありませんので、もし私が
はREWRITE_BASE
、URLでindex.php
の除去を可能にするためにModの書き換えを使用しています私のローカルテストサーバーでは、仮想ホストをセットアップするのが怠惰なので、すべての場所を自分のフォルダに入れます。ですから、この定数を変更し、一致する.htaccessの値をあなたのサブフォルダが何であれ(おそらく何もない)に変更したいとします。ここでは、サブフォルダ内で使用する方法の例を挙げておきました。
最後に、これは従来のMVCアーキテクチャのC
です。コントローラでは "ビジネスロジック"と呼ばれることを避けるべきですが、コントローラから直接HTMLを出力しないようにする必要があります(例ではこれを行っていますが)。 HTMLを出力するのではなく、Blade
やTwig
のようなテンプレートエンジンを使用することをお勧めします。 「モデル(ビジネスロジック)」を「ビュー(テンプレート)」に結合する「接着剤」のようなコントローラーを考えてみましょう。ビジネスロジックは、ユーザーのデータベース機能を処理するユーザークラス(名詞のような大文字のU、ユーザーコントローラーのような小文字ではない)のようになります。したがって、コントローラにそのコードを置く代わりに、 "User Model"を構築し、それをコントローラにインポートします。これは「正しい方法」ですが、もちろん複雑さが増しますが、後でその組織を見れば時間を節約することができます。今
いくつかの例
404エラー(及び逃し経路):
デフォルトのホーム・ページ:からhome::index()
http://example.com/home/index/hello
ルートにhome::index()
http://example.com/home/index
ルートにhome::index()
http://example.com/home
ルートにhome::index()
http://example.com/index.php
ルートに
http://example.com/
ルートhome::index('hello','world')
から
http://example.com/home/index/hello/world
ルート、それはあなたが家の引数のために完全なパスを入れて持っている現状では、上記のコードは、このために、アカウントに変更することができたが、それは不足しているページのいくつかの影響があります。基本的に欠けているページはコントローラの引数になります。したがって、もしあなたがhttp://example.com/user/foo
を持っていたなら、それはuser::index('foo')
と呼ばれます。もちろん、これも考慮に入れることができますが、複雑さは積み重なり始めます。
http://example.com/home/otherpage
home::otherpage()
にルーティングしますが、引数が見つからないことを警告します。 home::otherpage('hello')
あなたが見れば
から
home::otherpage('hello')
http://example.com/index.php/home/otherpage/hello
ルートに
へuser::index()
http://example.com/user/login
ルートにuser::index()
http://example.com/user/index
ルートに
外部リンクが内部でどのようにリダイレクトされているか。誤ってそのリンクを内部に変更していますか?私の.htaccessファイルには、FallbackResource index.phpがあります。あなたが使用している.htaccessルールのいくつかを共有できますか?実際のホスト名の代わりに 'www.mysite.com'を実行するなど、ホストのように公開したくないものは必ず削除してください。 – ArtisticPhoenix
PHPのほんの少しですが、外部リクエストは決して内部的に処理されるべきではありません。 IE。あなたはそれを理解するのに十分な情報を与えられていない。 – ArtisticPhoenix
FallbackResource index.phpは、.htaccessファイルにある唯一のコードで、index.phpファイルを使用するか、フォールバックするかを指示します。 .htaccessを使用する代わりにPHPを使用してハードコーディングしたい。 –