0x00 路由實作原理
使用者透過指定的URL範式對後台進行訪問,URL路由處理類別進行處理後,轉送到邏輯處理類,邏輯處理類別將請求結果傳回給使用者。
約定一套自己喜歡的,對搜尋引擎友好,對用戶友好的URL規則
對用戶請求的URL進行解析處理,取得到使用者請求的類,方法,以及Query參數等,並將請求轉發給邏輯處理類。
處理網站的真實業務邏輯。
0x01 URL範式約定
目前來說,有兩種比較流行的URL格式,一種是普通模式,一種是 pathinfo
模式。
在ThinkPHP
框架中,預設的URL格式即為普通模式,普通模式URLL:
<code>index.php?m=home&c=user&<span>a</span>=login&v=<span>value</span></code>
其中m
參數的值為模組名稱, 名稱,
a 參數的值為方法名稱,之後的參數則為該方法中所要接收的其他
GET 請求參數
CodeIgniter 框架中,預設的URL格式為模式,如下:
<code><span>index</span>.php/controller/<span><span>method</span>/<span>prarme1</span>/<span>value1</span></span></code>
這塊的意義也已經標註的很明白了,在
method 以後,就是方法接收的GET 參數了,格式就是
名稱/值核心)
此處我們選用最簡單的普通單模組模式進行演示,只為說明簡單的原理,如下:
<code>index.php?c=user&<span>a</span>=login&v=<span>value</span></code>
我們約定參數
c為控制器名稱,參數
a 為方法名稱,之後的皆是GET
參數<pre class="brush:php;toolbar:false"><code><span><span><?php</span><span>include</span><span>'index.class.php'</span>;
<span>include</span><span>'user.class.php'</span>;
<span>// 对用户请求URL进行处理</span><span>$query</span> = <span>$_GET</span>;
<span>$controller</span> = <span>isset</span>(<span>$query</span>[<span>'c'</span>]) ? <span>$query</span>[<span>'c'</span>] : <span>'indexController'</span>;
<span>$action</span> = <span>isset</span>(<span>$query</span>[<span>'a'</span>]) ? <span>$query</span>[<span>'a'</span>] : <span>'index'</span>;
<span>if</span> (class_exists(<span>$controller</span>)) {
<span>if</span> (method_exists(<span>$controller</span>, <span>$action</span>)) {
<span>unset</span>(<span>$_GET</span>[<span>'c'</span>]);
<span>unset</span>(<span>$_GET</span>[<span>'a'</span>]);
<span>// 实例化用户请求类并调用方法</span>
(<span>new</span><span>$controller</span>())-><span>$action</span>();
} <span>else</span> {
<span>echo</span><span>'控制器'</span> . <span>$controller</span> . <span>'中不存在方法'</span> . <span>$action</span>;
}
} <span>else</span> {
<span>echo</span><span>'不存在控制器'</span> . <span>$controller</span>;
}</span></span></code></pre>
其中unset()
掉兩個get參數,只是為了對真正呼叫的方法造成其他影響。
0x03 邏輯處理類別邏輯處理類別就是最終的業務邏輯,也就是真正的回應使用者請求的程式碼片段。下面只是一個簡單的範例:
<code><span>/* index.class.php 文件源码 */</span><span><?php</span><span><span>class</span><span>indexController</span> {</span><span>public</span><span><span>function</span><span>index</span><span>()</span>{</span> var_dump(<span>$_GET</span>); } }</code>
<code><span>/* user.class.php 文件源码 */</span><span><?php</span><span><span>class</span><span>user</span> {</span><span>public</span><span><span>function</span><span>index</span><span>()</span> {</span><span>echo</span><span>'这里是User控制器'</span>; } <span>public</span><span><span>function</span><span>login</span><span>()</span> {</span> var_dump(<span>$_GET</span>); } }</code>
0x04 結束
這裡只是最簡單的PHP路由技術的原理,其實真正為一個項目或者框架進行路由開發,可能需要能夠兼容很多複雜的情況,需要對各種情況都要考慮到。
原文作者:我才是二亮原文連結:http://www.2liang.me/?p=230
轉載必須在正文中標註並保留原文連結、作者等資訊。
以上就介紹了PHP路由技術的原理與實踐,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。