<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 使用控制器(Using Controllers) # 使用控制器(Using Controllers) 控制器提供了一堆可以被調用的方法,即:action。action是控制器中用于處理請求的方法。默認情況下,全部控制器public的方法都會映射到action并且可以通過URL訪問。action負責解釋請求和創建響應。通常,響應是以渲染的視圖格式被創建,但也存在其他的方式來創建(譯者注:如AJAX請求返回JSON格式的數據)。 例如,當你訪問一個類似這樣的URL時:<http://localhost/blog/posts/show/2015/the-post-title>,Phalcon默認會這樣分解各個部分: 這時,PostsController將會處理這個請求。在一個項目中,沒有強制指定放置控制器的地方,這些控制器都可以通過使用 [*autoloaders*](#) 來加載,所以你可以根據需要自由組件你的控制器。 控制器類必須以“Controller”為后綴,action則須以“Action”為后綴。一個控制器類的例子如下: ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function indexAction() { } public function showAction($year, $postTitle) { } } ``` ``` 額外的URI參數定義為action的參數,以致這些參數可以簡單地通過本地變量來獲取。控制器可以選擇繼承 [*Phalcon\\Mvc\\Controller*](#) 。如果繼承此基類,你的控制器類則能輕松訪問應用的各種服務。 沒有默認缺省值的參數視為必須參數處理。可以像PHP那樣為參數設定一個默認值: ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function indexAction() { } public function showAction($year = 2015, $postTitle = 'some default title') { } } ``` ``` 參數將會按路由傳遞和函數定義一樣的順序來賦值。你可以使用以下根據參數名稱的方式來獲取任意一個參數: ``` <pre class="calibre14">``` <?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) 循環調度將會在分發器執行,直到沒有action需要執行為止。在上面的例子中,只有一個action被執行到。現在讓我們來看下“forward”(轉發)怎樣才能在循環調度里提供一個更加復雜的操作流,從而將執行轉發到另一個controller/action。 ``` <pre class="calibre14">``` <?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"); // Forward flow to another action $this->dispatcher->forward( array( "controller" => "users", "action" => "signin" ) ); } } ``` ``` 如果用戶沒有訪問某個action的權限,那么請求將會被轉發到Users控制器的signin行為。 ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class UsersController extends Controller { public function indexAction() { } public function signinAction() { } } ``` ``` 對于“forwards”轉發的次數沒有限制,只要不會形成循環重定向即可,否則就意味著你的應用將會停止(譯者注:如果瀏覽器發現一個請求循環重定向時,會終止請求)。如果在循環調度里面沒有其他action可以分發,分發器將會自動調用由 [*Phalcon\\Mvc\\View*](#) 管理的MVC的視圖層。 ### 初始化控制器(Initializing Controllers) [*Phalcon\\Mvc\\Controller*](#) 提供了初始化的函數,它會最先執行,并優于任何控制器的其他action。不推薦使用“\_\_construct”方法。 ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public $settings; public function initialize() { $this->settings = array( "mySetting" => "value" ); } public function saveAction() { if ($this->settings["mySetting"] == "value") { // ... } } } ``` ``` > “initialize”僅僅會在事件“beforeExecuteRoute”成功執行后才會被調用。這樣可以避免在初始化中的應用邏輯不會在未驗證的情況下執行不了。 如果你想在緊接著創建控制器對象的后面執行一些初始化的邏輯,你要實現“onConstruct”方法: ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function onConstruct() { // ... } } ``` ``` > 需要注意的是,即使待執行的action在控制器不存在,或者用戶沒有訪問到它(根據開發人員提供的自定義控制器接入),“onConstruct”都會被執行。 ### 注入服務(Injecting Services) 如果控制器繼承于 [*Phalcon\\Mvc\\Controller*](#) ,那么它可以輕松訪問應用的服務容器。例如,如果我們類似這樣注冊了一個服務: ``` <pre class="calibre14">``` <?php use Phalcon\DI; $di = new DI(); $di->set('storage', function () { return new Storage('/some/directory'); }, true); ``` ``` 那么,我們可以通常多種方式來訪問這個服務: ``` <pre class="calibre14">``` <?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'); // 另一種方式:使用魔法getter來訪問 $this->getDi()->getStorage()->save('/some/file'); // 使用數組下標 $this->di['storage']->save('/some/file'); } } ``` ``` 如果你是把Phalcon作為全能(Full-Stack)框架來使用,你可以閱讀框架中 [*by default*](#) 提供的服務。 ### 請求與響應(Request and Response) 假設框架預先提供了一系列的注冊的服務。我們這里將解釋如何和HTTP環境進行關聯和交互。“request”服務包含了一個 [*Phalcon\\Http\\Request*](#) 的實例,“response”服務則包含了一個 [*Phalcon\\Http\\Response*](#) 的實例,用來表示將要返回給客戶端的內容。 ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function indexAction() { } public function saveAction() { // 檢查請求是否為POST if ($this->request->isPost() == true) { // 獲取POST數據 $customerName = $this->request->getPost("name"); $customerBorn = $this->request->getPost("born"); } } } ``` ``` 響應對象通常不會直接使用,但在action的執行前會被創建,有時候 - 如在一個afterDispatch事件中 - 它對于直接訪問響應非常有幫助: ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function indexAction() { } public function notFoundAction() { // 發送一個HTTP 404 響應的header $this->response->setStatusCode(404, "Not Found"); } } ``` ``` 如需學習了解HTTP環境更多內容,請查看專題: [*request*](#) 和 [*response*](#) 。 ### 會話數據(Session Data) 會話可以幫助我們在多個請求中保持久化的數據。你可以從任何控制器中訪問 [*Phalcon\\Session\\Bag*](#)以便封裝需要進行持久化的數據。 ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class UserController extends Controller { public function indexAction() { $this->persistent->name = "Michael"; } public function welcomeAction() { echo "Welcome, ", $this->persistent->name; } } ``` ``` ### 在控制器中使用服務(Using Services as Controllers) 服務可以是控制器,控制器類通常會從服務容器中請求。據于此,任何一個用其名字注冊的類都可以輕易地用一個控制器來替換: ``` <pre class="calibre14">``` <?php // 將一個控制器作為服務進行注冊 $di->set('IndexController', function () { $component = new Component(); return $component; }); // 將一個命名空間下的控制器作為服務進行注冊 $di->set('Backend\Controllers\IndexController', function () { $component = new Component(); return $component; }); ``` ``` ### 創建基控制器(Creating a Base Controller) 對于某些應用特性如訪問控制列表(ACL),翻譯,緩存,和模板引擎一般對于控制器都是通用的。在這種情況下,我們鼓勵創建一個 “基控制器”,從而確保你的代碼遵循 [DRY](http://en.wikipedia.org/wiki/Don't_repeat_yourself) 。基控制器可以是一個簡單的類,然后繼承于 [*Phalcon\\Mvc\\Controller*](#) ,并封裝全部控制器都有的通用功能操作。反過來,你的控制器則繼承這個“基控制器”以便可以直接使用通用功能操作。 這個基類可以放置在任何一個地方,但出于代碼組織的便利我們推薦應該放置在控制器的目錄下,如:apps/controllers/ControllerBase.php。我們可以在啟動文件直接require這個文件,也可以使用自動加載: ``` <pre class="calibre14">``` <?php require "../app/controllers/ControllerBase.php"; ``` ``` 對通用組件(action,方法,和類屬性等)也在這個基類文件里面: ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class ControllerBase extends Controller { /** * 這個方法可以被不同的控制器子類使用 */ public function someAction() { } } ``` ``` 現在,其他全部的控制都繼承于ControllerBase,然后便可訪問通用組件(如上面講到的的): ``` <pre class="calibre14">``` <?php class UsersController extends ControllerBase { } ``` ``` ### 控制器中的事件(Events in Controllers) 控制器會自動作為 [*dispatcher*](#) 事件的偵聽者,使用這些事件并實現實現這些方法后,你便可以實現對應被執行的action的before/after鉤子函數: ``` <pre class="calibre14">``` <?php use Phalcon\Mvc\Controller; class PostsController extends Controller { public function beforeExecuteRoute($dispatcher) { // 這個方法會在每一個能找到的action前執行 if ($dispatcher->getActionName() == 'save') { $this->flash->error("You don't have permission to save posts"); $this->dispatcher->forward( array( 'controller' => 'home', 'action' => 'index' ) ); return false; } } public function afterExecuteRoute($dispatcher) { // 在找到的action后執行 } } ``` ``` | - [索引](# "總目錄") - [下一頁](# "使用模型(Working with Models)") | - [上一頁](# "MVC 架構(The MVC Architecture)") |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看