PHP URL 擬似静的解析
1. URL マッピングについて話しましょう
?
一般に、URL をマッピングするには 2 つの方法があります。1 つは mod_rewrite を使用する方法です。これについては多くのオンライン教科書があるため、詳細は説明しません。もう 1 つは、zend などのプログラムでシミュレーションすることです。
Framework/index.php/controller/action/var1/value1/var2/value2/ でそのようにします。ここ
実際、最も重要なことは、統合された入力インターフェイスを使用し、次に URL を解析し、最後にそれを対応するコントローラーのモジュールに転送することです。
? ? ここではシミュレートするために 2 つの簡単な関数を作成しました。
? ? 最初の関数は主にアドレス解析用で、/index.php/controller/action/var1/value1/var2/value2/ と同様のアドレスを解析する必要があります:コントローラー、モジュール、そしてパラメータ。
<?php /** *对url路由进行简单的解析,支持对/path/to/site/index.php/module/action/parm/value * /path/to/site/index.php?/module/action/parm/value和 * /path/to/site/?/module/action/parm/value三种形式的处理 *@param:null *@return:router array */ function url_router() { $path = strip_tags ( $_SERVER ['REQUEST_URI'] ); $strpos = strpos ( $path, '.php' ); if ($strpos) { $path = substr ( $path, $strpos + 4 ); } else { if (empty ( $_SERVER ['QUERY_STRING'] )) { $strpos = strpos ( $path, '?' ); if ($strpos) { $path = substr ( $path, $strpos + 1 ); } else { $path = ''; } } else { $path = $_SERVER ['QUERY_STRING']; } } //统一化$path的格式,如果$path的第一个字符为/则去掉 if ($path [0] == '/') { $path = substr ( $path, 1 ); } //解析,并且路由 if (! empty ( $path )) { $path = explode ( '/', $path ); $router ['controller'] = $path [0]; $router ['action'] = (! empty ( $path [1] )) ? $path [1] : 'index'; //print_r($path); for($i = 2; $i < sizeof ( $path ); $i = $i + 2) { $params [$path [$i]] = (isset ( $path [$i + 1] )) ? $path [$i + 1] : ''; } $router ['params'] = $params; } else { //默认路由信息 $router ['controller'] = 'index'; $router ['action'] = 'index'; $router ['params'] = array (); } return $router; } ?>
メインの URL 解析機能はここで完了し、次の機能が実装されます (この機能の実装は私自身のアーキテクチャと組み合わせているため、採用する場合は修正が必要です)。もちろん、MVC が同様の zend フレームワークである場合は、大したことはないはずです)
<?php function url_dispatch($router, $app_path = '/app/controllers/') { require_once (SERVER_PATH . '/libs/controller.class.php'); $controller = $router ['controller'] . 'Controller'; //echo SERVER_PATH.$app_path.$controller.'.class.php'; if (! file_exists ( SERVER_PATH . $app_path . $controller . '.class.php' )) die ( '缺少必要的类!' ); require_once (SERVER_PATH . $app_path . $controller . '.class.php'); $controller = new $controller (); $controller->_setParam ( $router ['params'] ); $controller->{$router ['action'] . 'Action'} (); return true; } ?>