php MVC 架構中的路由器(Router)是如何工作的(附代碼)

來源:互聯網
上載者:User
本篇文章給大家帶來的文章是關於php MVC 架構中的路由器(Router)是如何工作的(附代碼),內容很不錯,有需要的朋友可以參考一下,希望可以協助到大家。

說明: 貌似 SF 譯文類別出 BUG,所以本文以原創類別給出。

MVC 路由器(Router)或分發器(Dispatcher)會檢測 HTTP 要求的 URL,並嘗試將單個 URL 組件與控制器和控制器中定義的方法匹配,同時將所有參數傳入方法中。

下面給出了一個簡單的路由器類,可以大致闡明路由器是如何工作的。然而在實際項目中,路由器要比下面的樣本路由器複雜很多,因為它必須處理更多的東西。

<?phpclass SimpleRouter{    // 路由數組,儲存我們定義的路由    private $routes;    // 這個方法用於將定義的路由加入到 $routes 數組    function add_route($route, callback $closure)    {        $this->routes[$route] = $closure;    }    // 執行特定的路由    function execute()    {        $path = $_SERVER['PATH_INFO'];        /**        * 檢測給定路由是否被定義,        * 或者執行預設的 '/' 首頁路由。        */        if (array_key_exists($path, $this->route)) {            $this->route[$path]();        } else {            $this->route['/]();        }    }}

SimpleRouter 類是 MVC 路由器的簡化模型。它的主要功能是將使用者定義的每個路由添加到數組中,並執行它。要理解它是如何工作的,請將下面的代碼複製到 index.php 檔案中。

<?php// index.phpclass SimpleRouter{    // 路由數組,儲存我們定義的路由    private $routes;    // 這個方法用於將定義的路由加入到 $routes 數組    function add_route($route, callback $closure)    {        $this->routes[$route] = $closure;    }    // 執行特定的路由    function execute()    {        $path = $_SERVER['PATH_INFO'];        /**        * 檢測給定路由是否被定義,        * 或者執行預設的 '/' 首頁路由。        */        if (array_key_exists($path, $this->route)) {            $this->route[$path]();        } else {            $this->route['/]();        }    }}/* 建立 Router 執行個體 */$router = new SimpleRouter(); /* 添加首頁閉包值路由器 */$router->add_route('/', function(){    echo 'Hello World';}); /* 添加另一個閉包路由 */$router->add_route('/greetings', function(){    echo 'Greetings, my fellow men.';}); /* 添加可回呼函數作為路由 */$router->add_route('/callback', 'myFunction');  /* 回呼函數處理常式 */function myFunction(){    echo "This is a callback function named '" .  __FUNCTION__ ."'";}/* 執行路由 */$router->execute();

現在到瀏覽器訪問下列 url:

http://localhost/index.php/http://localhost/index.php/greetingshttp://localhost/index.php/callback

對於每個 url,你應該會看到在我們的路由中定義的不同訊息。那麼路由器是如何工作的呢?

在我們的樣本中,add_route 方法將 url 的路徑名(route)添加到路由數組,並且定義對應的處理操作。這個處理操作可以是一個簡單的函數或者回呼函數,作為閉包傳入。現在當我們執行路由器的 execute 方法時,它會檢測在當前 &dollar;routes 數組中是否匹配到路由,如果有,則執行這個函數或回呼函數。

如果你使用 var_dump 這個 &dollar;routes 數組,你可以看到數組的具體內容。對於每個定義的路由都儲存一個閉包與其關聯。

array (size=3)  '/' =>     object(Closure)[2]  '/greetings' =>     object(Closure)[3]  '/callback' => string 'myFunction' (length=10)

執行處理由以下幾行完成。&dollar;this->routes[$path]** 語句返回一個閉包,該閉包儲存在 **\$routes 數組中,用於指定路由的執行,注意語句結尾處的 ()

$this->routes[$path]();// 或$this->routes['/']();

上面的樣本簡單地示範了路由器的工作原理,為了簡單起見,我們沒有處理任何錯誤,也沒有考慮路由的安全性問題。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.