Actions
是控制器中用於處理請求的方法。默認狀況下,控制器中全部公共方法都映射到Actions
,可以經過URL
訪問。Actions
負責解釋請求並建立響應,響應一般以視圖形式呈現,或經過其餘方式建立。php
當訪問相似http://localhost/blog/posts/show/2015/the-post-title
的URL
時,Phalcon
會像下面這樣解析URL
的各個部分:數組
Phalcon目錄 | blog |
控制器 | posts |
方法 | show |
參數 | 2015 |
參數 | the-post-title |
這種狀況下,控制器PostsController
將負責處理該請求。控制器能夠經過Phalcon\Loader
加載,所以控制器存放在應用中什麼地方,並無強制要求,能夠根據需求自由的組織控制器。框架
控制器名稱以Controller
結尾,Actions
名稱以Action
結尾。oop
<?php use Phalcon\Mvc\Contrller; class PostsController extends Contrller { public function indexAction() { } public function showAction($year, $postTitle) { } }
額外的URI
參數被定義爲Action
的參數,能夠經過局部變量訪問它們。控制器若是繼承基類Phalcon\Mvc\Controller
,即可以訪問應用中的各類服務。post
沒有默認值的參數被視爲必選參數,能夠像PHP
那樣爲參數設定默認值:this
<?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function indexAction() { } public function showAction($year = 2015, $postTitle = 'some default title') { } }
參數按照它們在路由中傳遞的順序進行分配,能夠經過參數名稱獲取任意參數:spa
<?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function indexAction() { } public function showAction() { $year = $this->dispatcher->getParam('year'); $postTitle = $this->dispatcher->getParam('postTitle'); } }
調度循環在調度器中運行,直到沒有剩餘操做須要執行。上例中,只有一個動做被執行。forward()
方法在調度循環中提供更復雜的操做流,能夠將操做轉發給其餘控制器 / 方法。code
<?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function indexAction() { } public function showAction($year, $postTitle) { $this->flash->error( "You don't have permission to access this area" ); // 轉發給另外一個方法 $this->dispatcher->forward( [ 'controller' => 'users', 'action' => 'signin', ] ); } }
若是用戶沒有訪問某個方法的權限,則將用戶轉發到UsersController
控制器的signin
方法。component
<?php use Phalcon\Mvc\Controller; class UsersController extends Controller { public function indexAction() { } public function signinAction() { } }
Phalcon\Mvc\Controller
提供了initialize()
方法,它在全部方法被執行前執行,不建議使用構造方法__construct()
。對象
<?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public $settings; public function initialize() { $this->settings = [ 'mySetting' => 'value', ]; } public function saveAction() { if ($this->settings['mySetting'] === 'value') { // ... } } }
只有當beforeExecuteRoute
事件成功執行時,initialize()
方法才被調用,避免了初始化方法中的應用邏輯沒法在未受權的狀況下執行。
若是想在構造控制器對象以後執行初始化邏輯,能夠實現onConstruct()
方法:
<?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function onConstruct() { // ... } }
注意,即便被調用的方法不存在於控制器中,或者用戶無權訪問(根據開發者定義的權限控制)該方法,onConstruct()
方法仍會被執行。
繼承了Phalcon\Mvc\Controller
的控制器,能夠訪問應用中的服務容器。例如,若是註冊了這樣的服務:
<?php use Phalcon\Di; $di = new Di(); $di->set( 'storage', function () { return new Storage( '/some/directory' ); }, true );
能夠經過多種方式訪問該服務:
<?php use Phalcon\Mvc\Controller; class FilesController extends Controller { public function saveAction() { // 訪問與服務同名的屬性來注入服務 $this->storage->save('/some/file'); // 從DI中訪問服務 $this->di->get('storage')->save('/some/file'); // 使用魔術方法getter $this->di->getStorage()->save('/some/file'); $this->getDi()->getStorage()->save('/some/file'); // 使用數組語法 $this->di['storage']->save('/some/file'); } }
假設框架預先註冊好了服務。request
服務包含一個Phalocn\Http\Request
實例,response
服務包含一個Phalcon\Http\Response
實例,表示將要發送給客戶端的內容。
<?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function indexAction() { } public function saveAction() { // 檢查是否POST請求 if ($this->request->isPost()) { // 獲取POST數據 $customerName = $this->request->getPost('name'); $customerBorn = $this->request->getPost('born'); } } }
響應對象一般不是直接被使用,而是在方法執行前構建。有時,好比afterDispatch
事件中,直接訪問響應對象頗有用:
<?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function indexAction() { } public function notFoundAction() { // 發送HTTP 404 響應頭 $this->response->setStatusCode(404, 'Not Found'); } }
Session
可以在請求之間維持持久的數據,能夠從任何控制器中訪問Phalcon\Session\Bag
來封裝須要持久化的數據:
<?php use Phalcon\Mvc\Controller; class UserController extends Controller { public function indexAction() { $this->persistent->name = 'Micheal'; } public function welcomeAction() { echo 'Welcome, ', $this->persistent->name; } }
服務能夠充當控制器,控制器老是從服務容器中請求。所以,以類名稱註冊的任何服務,均可以充當控制器角色:
<?php // 將控制器註冊爲服務 $di->set( 'IndexController', function () { $component = new Component(); return $component; } ); // 帶命名空間的控制器 $di->set( 'Backend\Controllers\IndexController', function () { $component = new Component(); return $component; } );
控制器自動監聽調度事件,實現與事件名稱同名的方法,能夠在操做執行以前 / 以後實現鉤子:
<?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function beforeExecuteRoute($dispatcher) { // 在全部動做以前執行 if ($dispatcher->getActionName() === 'save') { $this->flash->error( "You don't have permission to save posts" ); $this->dispatcher->forward( [ 'controller' => 'home', 'action' => 'index', ] ); } } public function afterExecuteRoute($dispatcher) { // 在全部動做以後執行 } }