摘要:控制器使用控制器是控制器中用于處理請求的方法??刂破髅Q以結(jié)尾,名稱以結(jié)尾。控制器如果繼承基類,便可以訪問應用中的各種服務。初始化控制器提供了方法,它在所有方法被執(zhí)行前執(zhí)行,不建議使用構(gòu)造方法。
Phalcon 控制器 使用控制器(Using Controllers)
Actions是控制器中用于處理請求的方法。默認情況下,控制器中所有公共方法都映射到Actions,能夠通過URL訪問。Actions負責解釋請求并創(chuàng)建響應,響應通常以視圖形式呈現(xiàn),或通過其他方式創(chuàng)建。
當訪問類似http://localhost/blog/posts/show/2015/the-post-title的URL時,Phalcon會像下面這樣解析URL的各個部分:
Phalcon目錄 | blog |
控制器 | posts |
方法 | show |
參數(shù) | 2015 |
參數(shù) | the-post-title |
這種情況下,控制器PostsController將負責處理該請求??刂破骺梢酝ㄟ^PhalconLoader加載,因此控制器存放在應用中什么地方,并沒有強制要求,可以根據(jù)需求自由的組織控制器。
控制器名稱以Controller結(jié)尾,Actions名稱以Action結(jié)尾。
額外的URI參數(shù)被定義為Action的參數(shù),可以通過局部變量訪問它們??刂破魅绻^承基類PhalconMvcController,便可以訪問應用中的各種服務。
沒有默認值的參數(shù)被視為必選參數(shù),可以像PHP那樣為參數(shù)設(shè)定默認值:
參數(shù)按照它們在路由中傳遞的順序進行分配,可以通過參數(shù)名稱獲取任意參數(shù):
dispatcher->getParam("year"); $postTitle = $this->dispatcher->getParam("postTitle"); } }調(diào)度循環(huán)(Dispatch Loop)調(diào)度循環(huán)在調(diào)度器中運行,直到?jīng)]有剩余操作需要執(zhí)行。上例中,只有一個動作被執(zhí)行。forward()方法在調(diào)度循環(huán)中提供更復雜的操作流,可以將操作轉(zhuǎn)發(fā)給其他控制器 / 方法。
flash->error( "You don"t have permission to access this area" ); // 轉(zhuǎn)發(fā)給另一個方法 $this->dispatcher->forward( [ "controller" => "users", "action" => "signin", ] ); } }如果用戶沒有訪問某個方法的權(quán)限,則將用戶轉(zhuǎn)發(fā)到UsersController控制器的signin方法。
初始化控制器(Initializing Controllers)PhalconMvcController提供了initialize()方法,它在所有方法被執(zhí)行前執(zhí)行,不建議使用構(gòu)造方法__construct()。
settings = [ "mySetting" => "value", ]; } public function saveAction() { if ($this->settings["mySetting"] === "value") { // ... } } }只有當beforeExecuteRoute事件成功執(zhí)行時,initialize()方法才被調(diào)用,避免了初始化方法中的應用邏輯無法在未授權(quán)的情況下執(zhí)行。
如果想在構(gòu)造控制器對象之后執(zhí)行初始化邏輯,可以實現(xiàn)onConstruct()方法:
注意,即使被調(diào)用的方法不存在于控制器中,或者用戶無權(quán)訪問(根據(jù)開發(fā)者定義的權(quán)限控制)該方法,onConstruct()方法仍會被執(zhí)行。
注入服務(Injecting Services)繼承了PhalconMvcController的控制器,可以訪問應用中的服務容器。例如,如果注冊了這樣的服務:
set( "storage", function () { return new Storage( "/some/directory" ); }, true );可以通過多種方式訪問該服務:
storage->save("/some/file"); // 從DI中訪問服務 $this->di->get("storage")->save("/some/file"); // 使用魔術(shù)方法getter $this->di->getStorage()->save("/some/file"); $this->getDi()->getStorage()->save("/some/file"); // 使用數(shù)組語法 $this->di["storage"]->save("/some/file"); } }請求和響應(Request and Response)假設(shè)框架預先注冊好了服務。request服務包含一個PhalocnHttpRequest實例,response服務包含一個PhalconHttpResponse實例,表示將要發(fā)送給客戶端的內(nèi)容。
request->isPost()) { // 獲取POST數(shù)據(jù) $customerName = $this->request->getPost("name"); $customerBorn = $this->request->getPost("born"); } } }響應對象通常不是直接被使用,而是在方法執(zhí)行前構(gòu)建。有時,比如afterDispatch事件中,直接訪問響應對象很有用:
response->setStatusCode(404, "Not Found"); } }Session數(shù)據(jù)(Session Data)Session能夠在請求之間維持持久的數(shù)據(jù),可以從任何控制器中訪問PhalconSessionBag來封裝需要持久化的數(shù)據(jù):
persistent->name = "Micheal"; } public function welcomeAction() { echo "Welcome, ", $this->persistent->name; } }服務充當控制器(Using Services as Controller)服務可以充當控制器,控制器總是從服務容器中請求。因此,以類名稱注冊的任何服務,都可以充當控制器角色:
set( "IndexController", function () { $component = new Component(); return $component; } ); // 帶命名空間的控制器 $di->set( "BackendControllersIndexController", function () { $component = new Component(); return $component; } );控制器事件(Events in Controllers)控制器自動監(jiān)聽調(diào)度事件,實現(xiàn)與事件名稱同名的方法,可以在操作執(zhí)行之前 / 之后實現(xiàn)鉤子:
getActionName() === "save") { $this->flash->error( "You don"t have permission to save posts" ); $this->dispatcher->forward( [ "controller" => "home", "action" => "index", ] ); } } public function afterExecuteRoute($dispatcher) { // 在所有動作之后執(zhí)行 } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29659.html
摘要:原文發(fā)表于入門教程之目錄結(jié)構(gòu)很多初學的朋友,對于以框架為基礎(chǔ)構(gòu)建的項目,應該如何組織目錄結(jié)構(gòu)有點摸不著頭腦。只需要通過注冊這些目錄結(jié)構(gòu),即可正常使用。 原文發(fā)表于:Phalcon入門教程之目錄結(jié)構(gòu) 很多初學Phalcon的朋友,對于以Phalcon框架為基礎(chǔ)構(gòu)建的項目,應該如何組織目錄結(jié)構(gòu)有點摸不著頭腦。比如多模塊的項目中,如何共用libs類庫和models目錄中模型類的情況,就有很...
摘要:本文描述了框架中數(shù)據(jù)庫操作方法,主要討論框架的組件中的操作方法。屬性方法在框架中支持屬性的擴展查詢,在上例中,可以把條件語句改為同時省略查詢條件結(jié)果不變。 本文描述了PHP-Phalcon框架中數(shù)據(jù)庫操作方法,主要討論Phalcon框架的Model組件中的操作方法。更詳細的Model介紹請參考:官方文檔 1. 連接數(shù)據(jù)庫 在Phalcon框架中,通過在DI中注入db參數(shù)來實現(xiàn)數(shù)據(jù)庫的...
摘要:一般至少要在執(zhí)行路由前要判斷用戶是否具有權(quán)限一般在中,所以應該在它之前獲得填充。以下代碼可參考這里的方法就是重點。參考這里把對象保存在中。 showImg(https://segmentfault.com/img/bVkdih); 使用如下圖解釋這個組件: showImg(https://segmentfault.com/img/bVkdii); 實際最終真正要使用的是access_l...
摘要:后端開發(fā)的疑惑后端開發(fā)最常面對的一個問題性能高并發(fā)等等。而到了時代,在方面有了前后端分離概念移動后端更是無力渲染天然前后端分離。 先來上一張前端頁面的效果圖(Vue + Vux + Vuex + Vue-Router)。showImg(https://segmentfault.com/img/remote/1460000010207850); 第一次做gif 沒什么經(jīng)驗,太大了。加載...
本文將記錄我在Phalcon開發(fā)過程中遇到的問題,以及如何如何解決。 本文首發(fā)在我的博客,我更新之后會更新過來;如果想查看最新的,可以到我的博客:Phalcon填坑手冊:開發(fā)中會遇到的問題和解決方案(不斷更新) 1. 正確地在控制器中獲取參數(shù) 一般情況下,GET/POST請求獲取參數(shù): $this->request->get(參數(shù)名); $this->request->getPost(參數(shù)名) 路...
閱讀 1380·2021-09-22 15:09
閱讀 2734·2021-08-20 09:38
閱讀 2465·2021-08-03 14:03
閱讀 921·2019-08-30 15:55
閱讀 3397·2019-08-30 12:59
閱讀 3579·2019-08-26 13:48
閱讀 1916·2019-08-26 11:40
閱讀 708·2019-08-26 10:30