1. 程式人生 > 其它 >phalcon-入門篇6(控制器)

phalcon-入門篇6(控制器)

#phalcon-入門篇6(控制器)#

本教程基於phalcon2.0.9版本

##前言## 先在這裡感謝各位phalcon技術愛好者,我們提供這樣一個優秀的交流平臺

廢話不多說今天我們就開門見山的來講一講phalcon的控制器,控制器是MVC中的C層,也是業務邏輯處理相當重要的一個環節,它銜接了資料處理以及介面展示,phalcon的控制器為我們提供了非常豐富的函式方法,那麼今天就來初步瞭解一下phalcon控制器的一系列基本使用知識!

注:筆者水平有限,說的不正確的地方希望大家多多指正,一同交流技術

附上:

喵了個咪的部落格:http://w-blog.cn

教程程式碼庫:http://git.oschina.net/wenzhenxi/Phalcon-tutorial

phalcon官網地址:https://phalconphp.com

phalcon中文社群:http://www.iphalcon.cn/

##1. 引數,轉發,依賴注入##

說道控制器只要是使用過任何一個MVC框架的童鞋都不會陌生,控制器是處理業務邏輯的地方使用也是非常廣泛的,在之前的教程Helloword裡面我們簡單的使用控制器列印了一段話,接下來簡單來看看phalcon控制器為我們帶來的其他有意思的功能,我們先做準備工作我們先建立一個名為ControllerController的控制器檔案如下:

use PhalconMvcController;

// 控制器類 必須繼承Controller
class ControllerController extends Controller {
}

###1.1 引數###

說道引數有人會問題了,上一篇不是講了怎麼獲取請求引數嗎?這裡的引數是什麼呢?

其實這裡講的引數是phalcon提供的一種特殊獲取請求引數的方式我們在ControllerController中建立indexAction方法如下:

public function indexAction($Username, $Passwd, $email = '[email protected]') {

    echo $Username . '</br>';
    echo $Passwd . '</br>';
    echo $email;
    echo '<h1>Controller/index!</h1>';
}

大家可以看到這個Action需要三個引數,這三個引數那裡來呢?我們試著訪問一下如下連線:

http://phalcon.w-blog.cn/phalcon/Controller/index/phalcon/passphalcon

結果如下:

機制的童鞋一定已經看懂了規則是這樣的:

直接匹配http://地址/模組名/方法名/引數1/引數2為第一個和第二個變數,第三個為預設值演示

注意:當請求是沒有傳遞引數1和引數2則會引起報錯

###1.2 轉發###

說道轉發可能有這樣一個場景,一個管理員使用者請求了過來但是這個使用者並沒有使用這個業務的許可權,我們需要讓使用者看到無許可權提示,其實在前面介紹返回的時候已經可以使用返回的重定向跳轉到無許可權提示頁面,或者可以使用如下方式:

public function index2Action() {

    $this->flash->error("當前使用者尚無訪問許可權!");

    // 跳轉到指定的控制器和方法
    $this->dispatcher->forward(array(
        "controller" => "Controller",
        "action"     => "index"
    ));

    echo '<h1>Controller/index2!</h1>';
}

大家試著訪問一下如下地址:

http://phalcon.w-blog.cn/phalcon/Controller/index2/phalcon/passphalcon

結果如下:

大家會發現幾個問題:

  1. 請求地址並沒有改變,並不是跳轉而是在原有index2Action執行了indexAction的內容
  2. 在轉發之後剩下的語句也被執行了echo
  3. 請求中index2之後帶有phalcon/passphalcon兩個引數

注意1:通過轉發之後本方法內的程式碼依然會被執行建議在轉發之後直接return不然後面的程式碼會繼續執行

注意2:當轉發到indexAction需要傳遞引數1和引數2的方法如果index2訪問的時候沒有傳遞引數1和引數2則會引起轉發之後的報錯

###1.3 依賴注入###

在之前我們並沒有介紹過依賴注入,但是我們確確實實已經開始使用了,在index.php中我們做了兩件事情:

// 建立一個DI例項
$di = new FactoryDefault();

//初始化session
$di->setShared('session', function () {

    $session = new Session();
    $session->start();
    return $session;
});

DI就是我們所說的依賴注入,但是在這裡並不打算仔細講解會在後續教程單獨開放一個章節來細細講解

大家可以看到我們已經在di例項中註冊了session也在index.php中體驗過了但是我們怎麼在控制器中去使用session呢我們看如下方法:

public function index3Action() {

    $this->session->set('phalcon', 'test');                            // 以和服務相同名字的類屬性訪問

    echo $this->di->getsession()->get('phalcon') . '</br>';            // 另一種方式:使用魔法getter來訪問
    echo $this->di->get('session')->get('phalcon') . '</br>';          // 通過DI訪問服務
    echo $this->di['session']->get('phalcon') . '</br>';               // 使用陣列下標
    echo $this->getDI()->getsession()->get('phalcon') . '</br>';       // 通過getDI方法獲取例項

    echo '<h1>Controller/index3!</h1>';
}

結果就是列印了4個test,通過以上這麼多種方式我們都可以獲得DI例項並且從DI例項裡面取出我們想要使用的資源

##2. 流程函式,鉤子函式##

在很多特定的時候我們需要驗證許可權啊或者是在返回的時候進行特殊的處理,我們當然不會在每一個控制器的方法中反覆的重寫,普遍的做法是寫一個公用的方法然後大家都去請求它完成相應的操作,phalcon也提供很很多意義上的流程函式和鉤子函式,來方便我們做不同的處理

###2.1 流程函式###

流程函式有兩個一個是onConstruct一個是initialize我們先來看一下官方的解釋

onConstruct:緊接著建立控制器物件的後面執行一些初始化的邏輯

initialize:初始化的函式,它會最先執行,並優於任何控制器的其他action。

注意:即使待執行的action在控制器不存在“onConstruct”都會被執行。

我們加入如下程式碼以便使用:

public function onConstruct() {

    echo '<h1>onConstruct!</h1>';
}


public function initialize() {

    echo '<h1>initialize!</h1>';
}

###2.2 鉤子函式###

鉤子函式顧名思義,就是在程式執行前後對程式可以執行處理,phalcon中提供兩個函式beforeExecuteRouteafterExecuteRoute一樣我們先看下官方解釋

beforeExecuteRoute:鉤子函式在控制器被找到之前執行優先順序高於initialize

afterExecuteRoute:鉤子函式在控制器執行完之後執行

我們加入如下程式碼以便使用:

public function beforeExecuteRoute($dispatcher) {

    echo '<h1>beforeExecuteRoute!</h1>';
}

public function afterExecuteRoute($dispatcher) {
    
    echo '<h1>afterExecuteRoute!</h1>';
}

###2.3 優先順序###

在上面我們對流程函式,鉤子函式都進行了建立,並且都有輸出我們來請求一下看看他們執行的優先順序

http://phalcon.w-blog.cn/phalcon/Controller/index/phalcon/passphalcon

如下:

##3. 小結##

今天教程講的phalcon控制器的兩塊內容僅僅只是冰山一角,大家如果有使用phalcon-tools可以檢視一下**PhalconDiInjectable**中通過$this可以獲取34種例項以供使用,可以見得phalcon確實下了很多功夫,那麼今天的教程就到這裡了,也希望大家能多多嘗試不要偷懶哦!

注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!

Phalcon技術交流:364520707 PhalCon中文社群:287484785 歡迎大家的加入!