ホームページ  >  記事  >  バックエンド開発  >  CI フレームワークのソース コードの読み取り----------Router.php_PHP チュートリアル

CI フレームワークのソース コードの読み取り----------Router.php_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:09:16882ブラウズ

[php]  

/** 
* コードイグナイター
*
* PHP 5.1.6 以降用のオープンソース アプリケーション開発フレームワーク
*
* @package CodeIgniter
* @author ExpressionEngine 開発チーム
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since バージョン 1.0
* @filesource
 */
// ----------------------------------------------- ------------------------
/** 
* ルータークラス
*
* URI を解析し、ルーティングを決定します
*
* @package CodeIgniter
* @subpackage ライブラリ
* @author ExpressionEngine 開発チーム
* @category ライブラリ
* @link http://codeigniter.com/user_guide/general/routing.html
 */
クラス CI_Router {
/** 
* 構成クラス
* 配置
* @var オブジェクト
* @access public
     */
var $config;  
/**
* 路線一覧
* ルートリスト、値はAPPPATH/config/route.phpから取得されます
* @var 配列
* @アクセス公開
*/
var $routes = array();  
/**
* エラールートのリスト
* エラールーティングリスト
* @var 配列
* @アクセス公開
*/
var $error_routes = array();  
/** 
* 現在のクラス名
* URI中のコントローラー
* @var 文字列
* @access public
     */
var $class = '';  
/**
* 現在のメソッド名
* 呼び出された関数はURIで表示され、デフォルトはindex()です
* @var 文字列
* @アクセス公開
*/
var $method = 'インデックス';  
/**
* 要求されたコントローラー クラスを含むサブディレクトリ
* URI 内の実際のディレクトリ情報
* @var 文字列
* @アクセス公開
*/
var $directory = '';  
/**
* デフォルトのコントローラー (および特定の場合はメソッド)
*デフォルトコントローラー
* @var 文字列
* @アクセス公開
*/
var $default_controller;  
/**
* コンストラクター
*
* ルートマッピング機能を実行します。
* config クラスと URI クラスをロードしてインスタンス化します
*/
関数 __construct()
{
$this->config =&load_class('Config', 'core');  
$this->uri =&load_class('URI', 'core');
Log_message('debug', "ルーター クラスが初期化されました");
}
// ----------------------------------------------- --- --------------------------
/**
* ルートマッピングを設定します
*
* この関数は、URI リクエストに基づいて何を提供するかを決定します。
* ルーティング設定ファイルに設定されているすべての「ルート」も同様です。
* デフォルトのルーティング情報を設定します。コントローラー情報がない場合は、routes.phpの設定に従ってデフォルトのコントローラーが読み込まれます。
*
*@アクセス非公開
* @return void
*/
関数_set_routing()
{
// クエリ文字列は設定ファイルで有効になっていますか? 通常、CI はクエリ文字列を使用しません
// URI セグメントは検索エンジンに適していますが、オプションで使用できます。
// この機能が有効な場合、少し異なる方法でディレクトリ/クラス/メソッドを収集します
query_stringsの形式は許可され、コントローラーが$ _getの方法で要求された場合、query_stringsの形式でルーティングされます。 还 // get でコントローラーを指定したかどうかをまだ判断する必要があるのはなぜですか?
// 実際には、リクエストルートの形式で ask_string が許可されているにもかかわらず、Appppath/Config/Config.php で設定されていないためです
O // Controller_trigger、Function_trigger、Directory_triggerはquery_stringsの形式では使用できません。
// 現時点では、引き続き「セグメント」フォームを使用します。
$segments = 配列();
if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')]))
//ディレクトリ名、コントロール名、メソッド名によって渡される変数名を取得します。これら 3 つの項目は config/config.php で定義されます。
if (isset($_GET[$this->config->item('directory_trigger')]))
$this->set_directory(trim($this->uri->_filter_uri($_GET[$this->config->item('directory_trigger')])));
$segments[] = $this->fetch_directory();
}
if (isset($_GET[$this->config->item('controller_trigger')]))
$this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')])));
$segments[] = $this->fetch_class();
}
if (isset($_GET[$this->config->item('function_trigger')]))
$this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')])));
$segments[] = $this->fetch_method();
}
}
// Routes.php ファイルをロードします。
// 現在の環境に応じて、APPPATH の下に Routes.php をロードします
if (define('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
}
elseif (is_file(APPPATH.'config/routes.php'))
include(APPPATH.'config/routes.php');
}
// 次の $route 変数は、デフォルトのコントローラーとデフォルトの 404 ページを設定するために、routes.php で定義されています
$this->routes = ( ! isset($route) OR ! is_array($route)) : $route; (Unset ($route); // 使用後は水を抜き、川にかかる橋は容赦なく解体する。
// イベントに表示できるようにデフォルトのコントローラーを設定します
// URI は有効なコントローラーに関連付けられていません。
// 先ほどの構成情報に基づいてデフォルトのコントローラーを設定します。そうでない場合は FLASE になります。
$this->default_controller = ( ! isset($this->routes['default_controller']) OR $this->routes['default_controller'] == '') FALSE : strto lower($this->) ? ;ルート['デフォルト_コントローラー']);
「使用を使用して「s」を使用して「s」を使用して「s」を使用すると、それらを検証し、完了してから救済します
// ディレクトリ名、コントロール名、メソッド名のいずれかをクエリ文字列から取得できるかどうかを確認します。
// 取得したら、ルートを直接決定して戻ります
if (count($segments) > 0)
置 // ルートを決定して設定します。
$ this- & gt; _Validate_request ($ セグメント) を返します。
}
// 完全な URI 文字列を取得します
// この関数の機能は、URI から検出して処理し、ルーティングを決定するために必要な情報 (index.php/index/welcome/1 など) を取得することです
// 文字列index/welcome/1)を$this->uri->uri_stringに入れます。
$this->uri->_fetch_uri_string();
// URI 文字列はありますか? ない場合は、「routes」ファイルで指定されたデフォルトのコントローラーが表示されます。
// uri_string が空の場合、ルートをデフォルトに設定します。
/*if ($this->uri->uri_string == '')
$ this-> を返す
}*/
// URL サフィックスを削除する必要がありますか?
// URI サフィックスを削除します。CI では URI の後にサフィックスを追加できますが、実際にはルートを検索するのに冗長であり、影響があるため、最初に削除します。
$this->uri->_remove_url_suffix();
// Compile セグメントを配列にコンパイルします
// 正のセクションで URI を分割し、各セクションを同時にフィルターし、$ this- & gt; セグメントに預けます
;
$this->uri->_explode_segments();
// 存在する可能性のあるカスタム ルーティングを解析します
// ルーティングを処理し、ルーティングに従ってAPPPATH/config/routes.phpを設定します
$this->_parse_routes();
// 0 ではなく 1 で始まるようにセグメント配列のインデックスを再作成します
// URI セグメント インデックスを 1 から開始するように設定します
$this->uri->_reindex_segments();
}
// ----------------------------------------------- --- --------------------------
/**
* デフォルトのコントローラーを設定します
* デフォルトのコントローラーを設定します
*@アクセス非公開
* @return void
*/
関数 _set_default_controller()
{
// Router::_set_routing() 関数の設定ファイルからデフォルトのコントローラー名を読み取ります。そうでない場合は FALSE になります
// このファイルの 158 行目
if ($this->default_controller === FALSE)
show_error("何を表示すべきかを決定できません。ルーティング ファイルにデフォルト ルートが指定されていません。");
}
// メソッドは指定されていますか?
// $this->default_controller に / があるかどうかで、指定されたメソッドがあるかどうかを判断します。 cusingの使用
if (strpos($this->default_controller, '/') !== FALSE)
$x =explode('/', $this->default_controller);
$this->set_class($x[0]);
$this->set_method($x[1]);
$this->_set_request($x);
}
その他
$this->set_class($this->default_controller);
$this->set_method('index');
$this->_set_request(array($this->default_controller, 'index'));
}
// ルーティングされたセグメント配列のインデックスを再作成し、0 ではなく 1 から始まるようにします
// 送信セグメントが添字 1 から始まるように保存されるように、セグメントのインデックスを再作成します。
$this->uri->_reindex_segments();
log_message('debug', "URI が存在しません。デフォルトのコントローラーが設定されています。");
}
// ----------------------------------------------- --- --------------------------
/**
* ルートを設定します
* ルーティングを設定する
* この関数は、
として URI セグメントの配列を取得、準備するアクションを受け取ります
* 入力し、現在のクラス/メソッドを設定します
*
*@アクセス非公開
* @param配列
* @param bool
* @return void
*/
関数 _set_request($segments = array())
{
使用
$segments = $this->_validate_request($segments);
// この関数は _set_default_controller によって呼び出されます。行 216 ~ 230 を見ると、この $segments が空ではないことがわかります
、しかし、次の2つの文は、パラメーターが空のときにこの方法が他の場所で呼び出されないようにするためです。
// $segments が空の場合はルーティングを設定できないため、コールバック時に $segments は空になりません。
if (count($segments) == 0)
$ this-> を返す
}
// ディレクトリ名でもあるクラス名を設定します
$this->set_class($segments[0]);
// メソッド名が存在する場合はそれを設定し、存在しない場合はインデックスに設定します
if (isset($segments[1]))
を使用して
$this->set_method($segments[1]);
}
その他
through の through through through ’ through ’ through ’ s ’ through ‐ to ‐ ‐ ‐ r‐ and ‐
using to ’ ’ ’ sholder toholder ’sholder ’ アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト スルー t-is t i o s
のスプーフィング。
$segments[1] = 'インデックス';
}
// セグメントを含むように「ルーティングされた」セグメント配列を更新します。
// 注: カスタム ルーティングがない場合、この配列は
になります。
// $this->uri-> セグメントと同一
// ルートのセグメント配列を更新します。ここにカスタム ルートがない場合、$this->uri->segments と同じになります
$this->uri->rsegments = $segments;
}
// ----------------------------------------------- --- --------------------------
/**
* Validates は、
へのパスの決定を試みます。
* コントローラー
* 提供されたセグメントを検証し、コントローラーへのパスを決定しようとします
*@アクセス非公開
* @param配列
* @return 配列
*/
関数_validate_request($segments)
{
// ? ? ? ? ? ? ? ? ? ? ? ? ? ?
if (count($segments) == 0)
$segments を返します。
}
// 要求されたコントローラーはルート フォルダーに存在しますか?
// APPPATH/controllers/ フォルダーの下の php ファイルに $segments[0] が存在するかどうかを確認します
if (file_exists(APPPATH.'controllers/'.$segments[0].'.php'))
$segments を返します。
}
// コントローラーはサブフォルダーにありますか?
// $segments[0] は APPPATH/controllers の下のサブディレクトリですか
if (is_dir(APPPATH.'controllers/'.$segments[0]))
s to ‐ out ‐ 一緒に to
// それが実際にディレクトリである場合、ルートのディレクトリ部分を決定できます。 ディレクトリを設定します
$this->set_directory($segments[0]);
// ディレクトリ部分を削除します。さらにルート検索。
$segments = array_slice($segments, 1);
I // URI リクエストにディレクトリ以外の段落がある場合は、指定されたコントローラへのリクエストになります。
if (count($segments) > 0)
” ” 求 // $ セグメント [0] を決定します。
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php'))
两 // エラーを報告するには 2 つの方法があり、1 つはデフォルトで、もう 1 つは自己決定です。
0 // 次の 404_Override は config/routes.php で定義されたルートです。 // その時点でのデフォルトの処理コントローラーが定義されている場合は、それを呼び出します。
if ( ! emptyempty($this->routes['404_override']))
があります
// 設定したばかりのルートのディレクトリ部分を削除します。これは、ルートが定義した 404 ルートになったためです。
️ // ここで、定義した 404 ルートは特定のディレクトリに配置することが許可されておらず、controllers/
の直下にのみ配置できることがわかります。
to ️
その他
’’ ’’ ’’ ’Out' '' s 's' of way out out out out out out out out out out out of of of the of 's’ s ''?
show_404($this->fetch_directory().$segments[0]); ️
}
}
その他
I // URI リクエストにディレクトリしかない場合は、ここに来ます
は3にsをsを取得します - tl 判 // 以下の判定は$ this-& gt; 指定されたメソッドがあるかどうかを判定するだけです。
if (strpos($this->default_controller, '/') !== FALSE)
$x =explode('/', $this->default_controller);
$this->set_class($x[0]);
$this->set_method($x[1]);  
}
その他
{
$this->set_class($this->default_controller);  
$this->set_method('index');  
}
// デフォルトのコントローラーはサブフォルダーに存在しますか?  
//APPPATH/controllers/目录/下面の有無を判断する方法
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php'))
{
$this->directory = '';  
return array();  
}
}
$segments を返します。  
}
// ここまで遥かに到達した場合、URI は使用相关联を有効な
に関連付けていないことを意味します
// コントローラー クラス。  オーバーライドがあるかどうかを見てみましょう
// ここに来ました、説明されています、つまり、コントローラー/下位のコントローラーにも到達しません、また、このような目標にも到達しません。
if ( ! emptyempty($this->routes['404_override']))
{
$x =explode('/', $this->routes['404_override']);  
$this->set_class($x[0]);  
$this->set_method(isset($x[1]) ? $x[1] : 'index');  
$x を返します。  
}
// この時点では、404 を表示する以外に何もすることはありません
// 展示一个404页面
show_404($segments[0]);  
}
// ----------------------------------------------- ---------------------
/**
* ルートを解析する
* ルートを解析する
* この関数は、
に存在する可能性のあるルートと一致します。
* に対する config/routes.php ファイル、
への URI に対する
* クラス/メソッドを再マップする必要があるかどうかの決定、決定
*
*@アクセス非公開
* @return void
*/
function _parse_routes()
{
// セグメント配列を URI 文字列に変換します
// 将セグメント数组转はウリ文字符列の形式
$uri = implode('/', $this->uri->segments);  
// リテラルの文字的、字面の一致はありますか?  そうであれば完了です
// このuriがroutes.phpで定義されている場合。。。。。
if (isset($this->routes[$uri]))
{
Return $ this- & gt_request (explode ('/', $ this-& gt; ルート [$ uri]));
}
// ワイルドカードを探してルート配列をループします
foreach ($this->$key => $val としてルート)
// ワイルドカードを RegEx に変換する 通常の変換にはワイルドカードを使用します
//
$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
‐ ‐ ‐ ‐ // RegEx は一致しますか?
使用
// 一致します。たとえば
// Routes.php には $route['show:any:num'] = 'anynum'; が含まれています。
// これら 2 つの設定を使用すると、showaa123 のような URI を、対応する値である anynum と照合できます
if (preg_match('#^'.$key.'$#', $uri))
// $ valに$があり、$ keyがある場合
// この if の機能がわかりません。 。 。専門家による救助を待っています
’s’ ’s out 1 out 1 out‐‐ 一緒に一緒に ‐ ‐
if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)
to uri to uri to uri to uri の uri to uri の uri の uri の uri の uri の uri の uri の uri の ss s ss s s ' 自体
----uri 内の一致する文字を $val に置き換えます
$val = preg_replace('#^'.$key.'$#', $val, $uri);
}
return $this->_set_request(explode('/', $val));
}
}
// ここまで到達したということは、
に遭遇しなかったことを意味します
// ルートが一致したので、サイトのデフォルト ルートを設定します
これは、一致するルートに遭遇していないことを意味します。
// そこで、ウェブサイトのデフォルトルートを設定します
$this->_set_request($this->uri->segments);
}
// ----------------------------------------------- --- --------------------------
/** 
* クラス名を設定します
*
* @access public
* @param string
* @return void
     */
関数 set_class($class)
{
$this->class = str_replace(array('/', '.'), '', $class);
}
// ----------------------------------------------- --- --------------------------
/** 
* 現在のクラスを取得します
*
* @access public
* @return string
     */
関数 fetch_class()
{
returned返品を使用します
}
// ----------------------------------------------- ---------------------
/** 
* メソッド名を設定します
*
* @access public
* @param string
* @return void
     */
関数 set_method($method)
{
$this->method = $method;  
}
// ----------------------------------------------- ---------------------
/** 
* 現在のメソッドを取得します
*
* @access public
* @return string
     */
関数 fetch_method()
{
if ($this->method == $this->fetch_class())
{
'インデックス' を返します。  
}
$this->メソッドを返す;  
}
// ----------------------------------------------- ---------------------
/** 
* ディレクトリ名を設定します
*
* @access public
* @param string
* @return void
     */
関数 set_directory($dir)
{
$this->directory = str_replace(array('/', '.'), '', $dir).'/';  
}
// ----------------------------------------------- ---------------------
/** 
* 要求されたコントローラー クラスを含むサブディレクトリ (存在する場合) を取得します
*
* @access public
* @return string
     */
関数 fetch_directory()
{
$this->ディレクトリを返します。  
}
// ----------------------------------------------- ---------------------
/**
* コントローラーのオーバーライドを設定します
* コントローラーオーバーライド
* この関数はディレクトリ、コントローラー、メソッドを再度カバーできます。
* @アクセス公開
* @param配列
* @return null
*/
function _set_overrides($routing)
{
if ( ! is_array($routing))
{
戻る;  
}
if (isset($routing['directory']))
{
$this->set_directory($routing['directory']);  
}
if (isset($routing['controller']) AND $routing['controller'] != '')
{ www.2cto.com
$this->set_class($routing['controller']);  
}
if (isset($routing['function']))
{ www.2cto.com
$routing['function'] = ($routing['function'] == '') ? 'インデックス' : $routing['関数'];  
$this->set_method($routing['function']);  
}
}
}
// ルータークラスの終了
/* Router.php ファイルの終わり */
/* 場所: ./system/core/Router.php */

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477681.html技術記事 [php] ?php if ( !定義(BASEPATH)) exit(スクリプトへの直接アクセスは許可されません); /** * CodeIgniter * * PHP 5.1.6 以降用のオープンソース アプリケーション開発フレームワーク * * @packag...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。