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