原文發表於: 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
Phalcon\Mvc\Controller
中提供了初始化函數 initialize()
,它是最早執行的,而且會優先於任何控制器的其餘action:git
public function initialize() { echo 'initialize'; }
有朋友可能會問,爲何不是 __construct()
函數?github
其實在 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
咱們進行以下測試:瀏覽器
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()
方法能同時獲取 GET
和 POST
請求的數據;$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中提供了兩種頁面跳轉方式。
public function test4Action(){ return $this->response->redirect('https://www.marser.cn'); }
仔細觀察會發現瀏覽器中的URL地址已經發生了變化。
public function test5Action(){ return $this->dispatcher->forward(array( 'controller' => 'test', 'action' => 'index', )); }
此種方式的頁面跳轉不會改變URL地址,只是將請求轉發到另外一個控制器的action。
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羣交流討論: