Phalcon入門教程之控制器

原文發表於: Phalcon入門教程之控制器

控制器在MVC分層中的主要做用是處理請求與響應。Phalcon中的控制器類必須以「 Controller 」爲後綴,action則以「 Action 」爲後綴。
Phalcon\Mvc\Controller 」是Phalcon中控制器的基類,咱們寫的控制器類經過繼承此基類,能夠調用在DI中註冊的各類服務。一個簡單的控制器類示例以下:php

namespace Marser\App\Frontend\Controllers;

use Phalcon\Mvc\Controller;

class IndexController extends Controller {
    public function indexAction(){
        echo 'front index';
        exit();
    }
}

在瀏覽器中訪問 http://localhost/index/index 便可看到打印結果。html

初始化

initialize()函數

Phalcon\Mvc\Controller 中提供了初始化函數 initialize(),它是最早執行的,而且會優先於任何控制器的其餘action:git

public function initialize() {
        echo 'initialize';
    }

有朋友可能會問,爲何不是 __construct() 函數?github

onConstruct()函數

其實在 Phalcon\Mvc\Controller 控制器基類中,__construct() 函數已經被聲明爲 final ,明確禁止子類重寫此函數(參考:http://www.iphalcon.cn/api/Ph... ) 。同時, Phalcon\Mvc\Controller 中提供了另外一個方法 onConstruct() 來執行初始化的邏輯:ajax

public function onConstruct(){
        var_dump('onConstruct');
    }

那麼, initialize()onConstruct() 的區別是什麼?執行順序又是怎樣的?api

initialize()和onConstruct()對比

咱們進行以下測試:瀏覽器

public function initialize() {
        var_dump('initialize');

        echo '<pre>';
        print_r($this);
    }

    public function onConstruct(){
        var_dump('onConstruct');

        echo '<pre>';
        print_r($this);
    }

    public function indexAction(){
        echo 'front index';
        exit();
    }

在瀏覽器中訪問 http://localhost/index/index 能夠看到執行順序是先 onConstruct() 函數,後 initialize() 函數。同時也經過打印當前對象 $this ,看出這兩個函數的區別之處:cookie

  • onConstruct() 是實例化對象的過程,至關於 new
  • initialize() 是初始化資源的過程。如加載DI中註冊的全部服務

接收請求數據

控制器中可經過以下方式接收瀏覽器發送過來的數據:session

public function test1Action(){
        $a = $this->request->get('a');
        $b = $this->request->getQuery('b');
        var_dump("a:{$a}");
        var_dump("b:{$b}");
        exit;
    }

在瀏覽器中訪問 http://localhost/index/test1?a=1&b=2 便可看到打印結果。這裏須要注意的是:
$this->request->get() 方法能同時獲取 GETPOST 請求的數據;
$this->request->getQuery() 只能獲取 GET 方式的請求數據;
$this->request->getPost() 只能獲取 POST 方式的請求數據。app

若想要URL更加的優雅,咱們能夠嘗試使用以下方式來接收URL參數:

public function test2Action($a, $b='bb'){
        var_dump("a:{$a}");
        var_dump("b:{$b}");
        exit;
    }

在瀏覽器中訪問如下兩種方式的URL,看看打印結果是什麼? :)
http://localhost/index/test2/1
http://localhost/index/test2/1/2

在Phalcon的路由匹配規則中,咱們能夠經過 $dispatcher來接收數據:

public function test3Action(){
        $a = $this->dispatcher->getParam('a');
        $b = $this->dispatcher->getParam('b');
        var_dump($a);
        var_dump($b);
    }

路由規則以下( app/config/routes.php):

'/index/test3/(\d+)/(\d+)' => array(
        'module' => 'frontend',
        'controller'=>'index',
        'action'=>'test3',
        'a' => 1,
        'b' => 2,
    ),

在瀏覽器中訪問 http://localhost/index/test3/111/222 便可看到打印的結果。

返回響應數據

public function test6Action(){
        return $this->response->setJsonContent(array(
            'code' => 1,
            'message' => 'success',
        ));
    }

在瀏覽器中訪問 http://localhost/index/test6 便可看到ajax返回的JSON數據。

頁面跳轉

Phalcon中提供了兩種頁面跳轉方式。

redirect()

public function test4Action(){
        return $this->response->redirect('https://www.marser.cn');
    }

仔細觀察會發現瀏覽器中的URL地址已經發生了變化。

forward()

public function test5Action(){
        return $this->dispatcher->forward(array(
            'controller' => 'test',
            'action' => 'index',
        ));
    }

此種方式的頁面跳轉不會改變URL地址,只是將請求轉發到另外一個控制器的action。

調用DI中註冊的服務

DI中註冊的全部服務,在控制器中均可以直接調用:

public function test7Action(){
        var_dump($this->session);
        var_dump($this->cookies);
        var_dump($this->request);
        var_dump($this->response);
        var_dump($this->db);
        var_dump($this->logger);
        //...
    }

咱們能夠在這裏發散一下,在DI中註冊咱們的全局配置對象:

$di -> setShared('config', function() use($config){
    return $config;
});

在控制器中直接調用( $this->config)便可。

以上代碼已託管在github:https://github.com/KevinJay/m...

最後,歡迎你們加入QQ羣交流討論:

  • 廣州PHP高端交流羣:158587573
  • Phalcon玩家羣:150237524
相關文章
相關標籤/搜索