phalcon-入門篇6(控制器)

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

本教程基於phalcon2.0.9版本git

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

廢話很少說今天咱們就開門見山的來說一講phalcon的控制器,控制器是MVC中的C層,也是業務邏輯處理至關重要的一個環節,它銜接了數據處理以及界面展現,phalcon的控制器爲咱們提供了很是豐富的函數方法,那麼今天就來初步瞭解一下phalcon控制器的一系列基本使用知識!session

注:筆者水平有限,說的不正確的地方但願你們多多指正,一同交流技術框架

附上:函數

喵了個咪的博客:http://w-blog.cnthis

教程代碼庫:http://git.oschina.net/wenzhenxi/Phalcon-tutorialspa

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

phalcon中文社區:http://www.iphalcon.cn/code

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

說道控制器只要是使用過任何一個MVC框架的童鞋都不會陌生,控制器是處理業務邏輯的地方使用也是很是普遍的,在以前的教程Helloword裏面咱們簡單的使用控制器打印了一段話,接下來簡單來看看phalcon控制器爲咱們帶來的其餘有意思的功能,咱們先作準備工做咱們先創建一個名爲ControllerController的控制器文件以下:

use Phalcon\Mvc\Controller;

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

###1.1 參數###

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

其實這裏講的參數是phalcon提供的一種特殊獲取請求參數的方式咱們在ControllerController中創建indexAction方法以下:

public function indexAction($Username, $Passwd, $email = 'test@test.com') {

    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能夠查看一下**\Phalcon\Di\Injectable**中經過$this能夠獲取34種實例以供使用,能夠見得phalcon確實下了不少功夫,那麼今天的教程就到這裏了,也但願你們能多多嘗試不要偷懶哦!

注:筆者能力有限有說的不對的地方但願你們可以指出,也但願多多交流!

Phalcon技術交流:364520707 PhalCon中文社區:287484785 歡迎你們的加入!

相關文章
相關標籤/搜索