Minor【 PHP框架】3.路由、控制器、視圖

来源:http://www.cnblogs.com/orlion/archive/2016/06/18/5594657.html
-Advertisement-
Play Games

3.1 路由 漂亮的URL絕對是一個嚴肅的web應用程式必須做到的,這種方式使index.php?article_id=57這類的醜陋URL被隱藏,由更受歡迎的像 /read/intro-to-symfony 來替代。 3.1.1 路由配置 配置文件為app/Config/routes.php 以上 ...


3.1 路由

  漂亮的URL絕對是一個嚴肅的web應用程式必須做到的,這種方式使index.php?article_id=57這類的醜陋URL被隱藏,由更受歡迎的像 /read/intro-to-symfony 來替代。

  3.1.1 路由配置

  配置文件為app/Config/routes.php

<?php
return [
  '/demo/{productName}'            =>  [
        'name'                =>    'test1',
        'controller'        =>    'App\Modules\Demo\Controller\FooController',
        'action'            =>    'bar',
        'required'          =>  ['productName' => '\w+'],
    ],
];

  以上邊代碼為例詳述一下如何配置一個優雅(laravel病上身...)的路由

  '/demo/{productName}'是路由的匹配規則,其中配置中的required制定的就是productName必須滿足的正則條件,在框架的實際運行過程中會將路由規則+required解析為正則表達式/demo/(\w+) ,當url(eg: xxx.xxx.xxx/demo/testproduct)匹配到這條正則時就會執行配置中的controller的action,具體的執行為:FooController->bar($productName);

  可以看到路由規則中的大括弧的內容(productName)就是就是bar這個方法的參數。所以在匹配路由時一定要註意路由規則必須與具體的控制器的方法的參數個數是一致的,不然就會拋出ControllerException。

  3.1.2 預設路由配置

    如果我們每定義一個Controller就要配置一個路由就會導致開發效率較低,為了防止這種問題發生Minor提供了預設路由機制。當我們訪問http://xxx.xxx.xxx/demo/foo/bar時就會執行App\Modules\Demo\FooController的bar方法,即預設路由為:

  http://xxx.xxx.xxx/{模塊名}/{控制器名}/{方法名}

  3.1.3 缺點

  正如你所見,Minor的路由並不強大。不支持請求方法的限制,不支持htttps限制,不支持過濾器。

 

3.2 控制器

  3.2.1 創建一個自己的控制器

  Controller的定義非常簡單,只要繼承Minor\Controller\Controller基礎類就可以了(當然你也可以不繼承,但是基類中的方法和屬性就不能使用了,這很好理解),首先創建文件夾app/Modules/Demo/Controller/,然後再創建文件FooController.php:

<?php
namespace App\Modules\Demo\Controller;

use Minor\Controller\Controller;
// 定義一個控制器
class FooController extends Controller
{
    // 定義一個方法   
    public function bar()
    {
        return 'Hello World';
    }
}

  通過訪問xxx.xxx.xxx/demo/foo/bar(預設路由,你也可以配置自己的路由)就可看到返回了Hello World。

  3.2.2 Url生成

  調用Url的gen方法可以將預設路徑轉為符合路由規則的url

$url = Url:gen($path);

  如根據3.1.1中的路由配置Url::gen('/demo/foo/bar?productName=test') 將返回 /demo/test。

  

  3.2.3 頁面跳轉redirect、重定向forward

  Minor提供了三個跳轉的方法分別是redirect、forward、forwardUrl(這三個都是Minor\Controller\Controller的protected方法)。

  當跳轉到另外一個url時可以在控制器這樣調用:$this->redirect($url);

  當轉向(froward)到另外一個url時可以在控制器中這樣調用: $this->forwardUrl($url);(該方法的實現其實就是通過路由解析出url請求的控制器和方法然後調用forward($controller, $action, $param))

  當轉向(forward)到另外一個方法時可以在控制器中這樣調用: $this->forward($controller, $action, $params); (參數$controller是控制器的類名,包含命名空間)

  例:

class FooController extends Controller
{
    public function bar()
    {
        $this->redirect('www.baidu.com');
        return $this->forward('App\Modules\Demo\Controller\FooController', 'bar', 'test');
        return $this->forward('/demo/testpro');
    }
}    

  3.2.4 獲取請求參數

  調用MinorRequest的get($paramName, $defaultParamValue = null) 或者 post($paramName, $defaultParamValue = null)方法就可以獲取請求方法,在控制器中可以這樣調用:

class FooController extends Controller
{
    public function bar()
    {
       $minorRequest = $this->app->getMinorRequest(); 
    $paramValue = $minorRequest->get('paramKey', 'defaultValue');
    ... } }

  3.2.5 獲取請求方法

  調用MinorRequest的getMethod()方法就可以獲取請求的方法:

class FooController extends Controller
{
    public function bar()
    {
       $minorRequest = $this->app->getMinorRequest(); 
    $method = $minorRequest->getMethod();
    ...
    }
}  

 

3.3 視圖

  Minor提供了一個極其強大的模板引擎,這個模板引擎的名稱就是: PHP。是的!你沒看錯就是PHP。為什麼Minor不提供一個類似於smarty或者Twig這樣的模板引擎呢? 因為沒有必要,PHP本身已經足夠好了,如果Minor再造一個模板引擎無疑就會使Minor更難上手,所以Minor直接使用PHP作為視圖文件的語言。

  3.3.1 在控制器中使用視圖

  在控制器中使用視圖只需要調用View::render('模塊名:控制器名:視圖文件名', ['param1key' => 'param1value', 'param2key' => 'param2value' ...]);例:

class FooController extends Controller
{
    public function bar()
    {
        $param1 = 'Hello';
        $param2 = 'World'; 
        return View::render('Demo:Foo:bar.php', ['param1' => $param1, 'param2' => $param2]);
    }
}  

  render函數的第二個參數(['param1key' => 'param1value', 'param2key' => 'param2value' ...])就是向視圖文件中傳遞的變數,我們可以在視圖文件中使用這些變數:

文件:app/Modules/Demo/Controller/Tpl/Foo/bar.php
<?php echo $param1key;?>
<?=$param2key ?>

  3.3.2 視圖內置函數

  Minor提供了兩個視圖文件中可以使用的函數:

function include_tpl($module, $controller, $tpl)
{
    require_once (!defined('APP_DIR') ? APP_DIR : realpath(__DIR__ . '/../../app/') .DIRECTORY_SEPARATOR) . 'Modules' . '/' . $module . '/Tpl/' . $controller . '/' . $tpl;
}

function url($path)
{
    return Url::gen($path);
}

  使用:

html>   
    <?php include_tpl('Public', 'Public', 'header.php');?> 
    <body>
        <h1>Hello!</h1>
        <a href="<?php url('/demo/foo/bar?productName=testpro');?>">
    </body>
</html>

  這兩個函數定義在app/Resource/functions.php文件中,你可以在這個文件中自定義你需要的視圖函數。

 

3.4 響應

  可以在控制器中通過調用App對象的getMinorResponse()方法來獲取當前MinorResponse對象。 MinorResponse類提供了六個方法分別是:

public function send(); // 用於將響應對象發送給客戶端

public function setHeader($header);// 設置響應頭

public function setContent($content); // 設置響應對象的內容

public function beforeContent($content); // 在當前已有的內容之前添加內容

public function appendContent($content); // 在當前已有內容之後追加內容

public function getContent(); // 獲取對象中的響應內容

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分類:C#、VS2015 創建日期:2016-06-18 使用教材:(十二五國家級規劃教材)《C#程式設計及應用教程》(第3版) 一、使用別人已經設計好的類簡化你的代碼編寫工作量 當讓你去處理一堆亂七八糟的事情時,要把它弄的有條理,首先需要“先把它分成幾大部分”(劃分為不同的“命名空間”或者“包”) ...
  • 本文內容全部出自《Python基礎教程》第二版,在此分享自己的學習之路。 lxx___歡迎轉載:http://www.cnblogs.com/Marlowes/p/5538341.htmllxx___ Created on Marlowes 本章將會給讀者展示一些例子,這些例子會使用多種Python ...
  • 引言 - sclog 總的設計思路 sclog在之前已經內置到simplec 簡易c開發框架中一個日誌庫. 最近對其重新設計了一下. 減少了對外暴露的介面. 也是C開發中一個輪子. 比較簡單, 非常適合學習理解,最後自己寫一個自己喜歡的日誌庫. 首先分析分級設計的總的思路. 主要是圍繞上面思路設計. ...
  • 剛開始學C,碰到經典的圍圈報數問題,現先將實現代碼附下: #include<stdio.h>#include<stdlib.h> struct LNODE{ //鏈表定義 int data; struct LNODE *next;};typedef struct LNODE Lnode;typede ...
  • “伯爵說”序列如下:1, 11, 21, 1211, 111221, ...1 讀作 "one 1" 或者 11。11 讀作 "two 1s" 或者21。21 讀作 "one 2, one 1" 或者 1211。 格式:多組輸入,讀到文件結束。每組輸入給定一個整數n,輸出第n個序列。(1<=n<=3 ...
  • 14.5 SQL 總結 到目前為止,我們在Python示常式序中使用了SQL,並且涉及了許多SQL基礎。在這一小節中,我們特別審視SQL語言,並對其語法進行回顧。 雖然有很多不同的資料庫供應商,但因SQL語言是標準化的,所以我們可以在不同的資料庫系統中方便地移植。 一個關係資料庫是由表、行和列構成的 ...
  • Java核心技術 捲1 基礎知識(第9版)Java核心技術 捲II 高級特性(第9版) 資料庫系統概念(原書第6版)Oracle 從入門到精通MySQL資料庫應用從入門到精通 Java併發編程實戰(第16屆Jolt大獎提名圖書,Java併發編程必讀佳作) Java網路編程(第3版)——O’Reill ...
  • 自己動手實踐了一次,發生中間出了一下問題,現整理出來,供參考。 新建一個java web項目 下載spring的jar包 "http://repo.spring.io/libs release local/org/springframework/spring/" 版本取決於你,我選擇的是4.0.4的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...