php MVC 框架中的路由器(Router)是如何運作的(附程式碼)

不言
發布: 2023-04-03 14:04:01
原創
3481 人瀏覽過

這篇文章帶給大家的文章是關於php MVC 框架中的路由器(Router)是如何運作的(附程式碼),內容很不錯,有需要的朋友可以參考一下,希望可以幫助大家。

說明: 看起來 SF 譯本類別出 BUG,所以本文以原始類別給出。

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

下面給出了一個簡單的路由器類,可以大致闡明路由器是如何運作的。然而在實際專案中,路由器要比下面的範例路由器複雜得多,因為它必須處理更多的東西。

<?php

class 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.php

class 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/greetings
http://localhost/index.php/callback
登入後複製

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

在我們的範例中,add_route 方法將 url 的路徑名稱(route)加入到路由數組,並且定義對應的處理操作。這個處理操作可以是一個簡單的函數或是回呼函數,作為閉包傳入。現在當我們執行路由器的 execute 方法時,它會偵測在目前 $routes 陣列中是否符合路由,如果有,則執行這個函數或回呼函數。

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

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

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

$this->routes[$path]();
// 或
$this->routes['/']();
登入後複製

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

相關推薦:

PHP MVC框架路由學習筆記,mvc框架路由學習筆記

PHP學習MVC框架之路由

以上是php MVC 框架中的路由器(Router)是如何運作的(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板