Phalcon控制器

Phalcon 控制器

使用控制器(Using Controllers)

Actions是控制器中用於處理請求的方法。默認狀況下,控制器中全部公共方法都映射到Actions,可以經過URL訪問。Actions負責解釋請求並建立響應,響應一般以視圖形式呈現,或經過其餘方式建立。php

當訪問相似http://localhost/blog/posts/show/2015/the-post-titleURL時,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');
    }
}

調度循環(Dispatch Loop)

調度循環在調度器中運行,直到沒有剩餘操做須要執行。上例中,只有一個動做被執行。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()
    {

    }
}

初始化控制器(Initializing Controllers)

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()方法仍會被執行。

注入服務(Injecting Services)

繼承了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 and Response)

假設框架預先註冊好了服務。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數據(Session Data)

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;
    }
}

服務充當控制器(Using Services as Controller)

服務能夠充當控制器,控制器老是從服務容器中請求。所以,以類名稱註冊的任何服務,均可以充當控制器角色:

<?php

// 將控制器註冊爲服務
$di->set(
    'IndexController',
    function () {
        $component = new Component();

        return $component;
    }
);

// 帶命名空間的控制器
$di->set(
    'Backend\Controllers\IndexController',
    function () {
        $component = new Component();

        return $component;
    }
);

控制器事件(Events in Controllers)

控制器自動監聽調度事件,實現與事件名稱同名的方法,能夠在操做執行以前 / 以後實現鉤子:

<?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)
    {
        // 在全部動做以後執行
    }
}
相關文章
相關標籤/搜索