PHP路由技術的原理與實踐

WBOY
發布: 2016-07-30 13:30:59
原創
1025 人瀏覽過

0x00 路由實作原理

使用者透過指定的URL範式對後台進行訪問,URL路由處理類別進行處理後,轉送到邏輯處理類,邏輯處理類別將請求結果傳回給使用者。

約定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 請求參數

pathinfo模式

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 參數<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;code&gt;&lt;span&gt;&lt;span&gt;&lt;?php&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt;'index.class.php'&lt;/span&gt;; &lt;span&gt;include&lt;/span&gt;&lt;span&gt;'user.class.php'&lt;/span&gt;; &lt;span&gt;// 对用户请求URL进行处理&lt;/span&gt;&lt;span&gt;$query&lt;/span&gt; = &lt;span&gt;$_GET&lt;/span&gt;; &lt;span&gt;$controller&lt;/span&gt; = &lt;span&gt;isset&lt;/span&gt;(&lt;span&gt;$query&lt;/span&gt;[&lt;span&gt;'c'&lt;/span&gt;]) ? &lt;span&gt;$query&lt;/span&gt;[&lt;span&gt;'c'&lt;/span&gt;] : &lt;span&gt;'indexController'&lt;/span&gt;; &lt;span&gt;$action&lt;/span&gt; = &lt;span&gt;isset&lt;/span&gt;(&lt;span&gt;$query&lt;/span&gt;[&lt;span&gt;'a'&lt;/span&gt;]) ? &lt;span&gt;$query&lt;/span&gt;[&lt;span&gt;'a'&lt;/span&gt;] : &lt;span&gt;'index'&lt;/span&gt;; &lt;span&gt;if&lt;/span&gt; (class_exists(&lt;span&gt;$controller&lt;/span&gt;)) { &lt;span&gt;if&lt;/span&gt; (method_exists(&lt;span&gt;$controller&lt;/span&gt;, &lt;span&gt;$action&lt;/span&gt;)) { &lt;span&gt;unset&lt;/span&gt;(&lt;span&gt;$_GET&lt;/span&gt;[&lt;span&gt;'c'&lt;/span&gt;]); &lt;span&gt;unset&lt;/span&gt;(&lt;span&gt;$_GET&lt;/span&gt;[&lt;span&gt;'a'&lt;/span&gt;]); &lt;span&gt;// 实例化用户请求类并调用方法&lt;/span&gt; (&lt;span&gt;new&lt;/span&gt;&lt;span&gt;$controller&lt;/span&gt;())-&gt;&lt;span&gt;$action&lt;/span&gt;(); } &lt;span&gt;else&lt;/span&gt; { &lt;span&gt;echo&lt;/span&gt;&lt;span&gt;'控制器'&lt;/span&gt; . &lt;span&gt;$controller&lt;/span&gt; . &lt;span&gt;'中不存在方法'&lt;/span&gt; . &lt;span&gt;$action&lt;/span&gt;; } } &lt;span&gt;else&lt;/span&gt; { &lt;span&gt;echo&lt;/span&gt;&lt;span&gt;'不存在控制器'&lt;/span&gt; . &lt;span&gt;$controller&lt;/span&gt;; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;</pre><div class="contentsignin">登入後複製</div></div>其中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教程有興趣的朋友有幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!