Minor【 PHP框架】3.路由、控制器、視圖,minor框架_PHP教程
Jul 12, 2016 am 08:49 AMMinor【 PHP框架】3.路由、控制器、視圖,minor框架
3.1 路由
漂亮的URL絕對是一個嚴(yán)肅的web應(yīng)用程序必須做到的,這種方式使index.php?article_id=57這類的丑陋URL被隱藏,由更受歡迎的像 /read/intro-to-symfony 來替代。
3.1.1 路由配置
配置文件為app/Config/routes.php
<?<span>php </span><span>return</span><span> [ </span>'/demo/{productName}' =><span> [ </span>'name' => 'test1', 'controller' => 'App\Modules\Demo\Controller\FooController', 'action' => 'bar', 'required' => ['productName' => '\w+'],<span> ]</span>,<span> ];</span>
以上邊代碼為例詳述一下如何配置一個優(yōu)雅(laravel病上身...)的路由
'/demo/{productName}'是路由的匹配規(guī)則,其中配置中的required制定的就是productName必須滿足的正則條件,在框架的實(shí)際運(yùn)行過程中會將路由規(guī)則+required解析為正則表達(dá)式/demo/(\w+) ,當(dāng)url(eg: xxx.xxx.xxx/demo/testproduct)匹配到這條正則時(shí)就會執(zhí)行配置中的controller的action,具體的執(zhí)行為:FooController->bar($productName);
可以看到路由規(guī)則中的大括號的內(nèi)容(productName)就是就是bar這個方法的參數(shù)。所以在匹配路由時(shí)一定要注意路由規(guī)則必須與具體的控制器的方法的參數(shù)個數(shù)是一致的,不然就會拋出ControllerException。
3.1.2 默認(rèn)路由配置
如果我們每定義一個Controller就要配置一個路由就會導(dǎo)致開發(fā)效率較低,為了防止這種問題發(fā)生Minor提供了默認(rèn)路由機(jī)制。當(dāng)我們訪問http://xxx.xxx.xxx/demo/foo/bar時(shí)就會執(zhí)行App\Modules\Demo\FooController的bar方法,即默認(rèn)路由為:
http://xxx.xxx.xxx/{模塊名}/{控制器名}/{方法名}
3.1.3 缺點(diǎn)
正如你所見,Minor的路由并不強(qiáng)大。不支持請求方法的限制,不支持htttps限制,不支持過濾器。
3.2 控制器
3.2.1 創(chuàng)建一個自己的控制器
Controller的定義非常簡單,只要繼承Minor\Controller\Controller基礎(chǔ)類就可以了(當(dāng)然你也可以不繼承,但是基類中的方法和屬性就不能使用了,這很好理解),首先創(chuàng)建文件夾app/Modules/Demo/Controller/,然后再創(chuàng)建文件FooController.php:
<?<span>php namespace App\Modules\Demo\Controller; </span><span>use</span><span> Minor\Controller\Controller; </span><span>//</span><span> 定義一個控制器</span> <span>class</span> FooController <span>extends</span><span> Controller { </span><span>//</span><span> 定義一個方法 </span> <span>public</span> <span>function</span><span> bar() { </span><span>return</span> 'Hello World'<span>; } }</span>
通過訪問xxx.xxx.xxx/demo/foo/bar(默認(rèn)路由,你也可以配置自己的路由)就可看到返回了Hello World。
3.2.2 Url生成
調(diào)用Url的gen方法可以將默認(rèn)路徑轉(zhuǎn)為符合路由規(guī)則的url
<span>$url</span> = Url:gen(<span>$path</span>);
如根據(jù)3.1.1中的路由配置Url::gen('/demo/foo/bar?productName=test') 將返回 /demo/test。
3.2.3 頁面跳轉(zhuǎn)redirect、重定向forward
Minor提供了三個跳轉(zhuǎn)的方法分別是redirect、forward、forwardUrl(這三個都是Minor\Controller\Controller的protected方法)。
當(dāng)跳轉(zhuǎn)到另外一個url時(shí)可以在控制器這樣調(diào)用:$this->redirect($url);
當(dāng)轉(zhuǎn)向(froward)到另外一個url時(shí)可以在控制器中這樣調(diào)用: $this->forwardUrl($url);(該方法的實(shí)現(xiàn)其實(shí)就是通過路由解析出url請求的控制器和方法然后調(diào)用forward($controller, $action, $param))
當(dāng)轉(zhuǎn)向(forward)到另外一個方法時(shí)可以在控制器中這樣調(diào)用: $this->forward($controller, $action, $params); (參數(shù)$controller是控制器的類名,包含命名空間)
例:
<span>class</span> FooController <span>extends</span><span> Controller { </span><span>public</span> <span>function</span><span> bar() { </span><span>$this</span>->redirect('www.baidu.com'<span>); </span><span>return</span> <span>$this</span>->forward('App\Modules\Demo\Controller\FooController', 'bar', 'test'<span>); </span><span>return</span> <span>$this</span>->forward('/demo/testpro'<span>); } } </span>
3.2.4 獲取請求參數(shù)
調(diào)用MinorRequest的get($paramName, $defaultParamValue = null) 或者 post($paramName, $defaultParamValue = null)方法就可以獲取請求方法,在控制器中可以這樣調(diào)用:
<span>class</span> FooController <span>extends</span><span> Controller { </span><span>public</span> <span>function</span><span> bar() { $minorRequest = <span>$this->app->getMinorRequest()</span>; </span><br /> $paramValue = <span>$minorRequest</span>->get('paramKey', 'defaultValue'<span>);<br /> ... } } </span>
3.2.5 獲取請求方法
調(diào)用MinorRequest的getMethod()方法就可以獲取請求的方法:
<span>class</span> FooController <span>extends</span><span> Controller { </span><span>public</span> <span>function</span><span> bar() { </span><span>$minorRequest</span> = <span>$this</span>->app-><span>getMinorRequest(); </span><span>$method</span> = <span>$minorRequest</span>-><span>getMethod(); </span>...<span> } } </span>
3.3 視圖
Minor提供了一個極其強(qiáng)大的模板引擎,這個模板引擎的名稱就是: PHP。是的!你沒看錯就是PHP。為什么Minor不提供一個類似于smarty或者Twig這樣的模板引擎呢? 因?yàn)闆]有必要,PHP本身已經(jīng)足夠好了,如果Minor再造一個模板引擎無疑就會使Minor更難上手,所以Minor直接使用PHP作為視圖文件的語言。
3.3.1 在控制器中使用視圖
在控制器中使用視圖只需要調(diào)用View::render('模塊名:控制器名:視圖文件名', ['param1key' => 'param1value', 'param2key' => 'param2value' ...]);例:
<span>class</span> FooController <span>extends</span><span> Controller { </span><span>public</span> <span>function</span><span> bar() { </span><span>$param1</span> = 'Hello'<span>; </span><span>$param2</span> = 'World'<span>; </span><span>return</span> View::render('Demo:Foo:bar.php', ['param1' => <span>$param1</span>, 'param2' => <span>$param2</span><span>]); } } </span>
render函數(shù)的第二個參數(shù)(['param1key' => 'param1value', 'param2key' => 'param2value' ...])就是向視圖文件中傳遞的變量,我們可以在視圖文件中使用這些變量:
文件:app/Modules/Demo/Controller/Tpl/Foo/bar.php<br /><?php echo $param1key;?><br /><?=$param2key ?>
3.3.2 視圖內(nèi)置函數(shù)
Minor提供了兩個視圖文件中可以使用的函數(shù):
<span>function</span> include_tpl(<span>$module</span>, <span>$controller</span>, <span>$tpl</span><span>) { </span><span>require_once</span> (!<span>defined</span>('APP_DIR') ? APP_DIR : <span>realpath</span>(__DIR__ . '/../../app/') .DIRECTORY_SEPARATOR) . 'Modules' . '/' . <span>$module</span> . '/Tpl/' . <span>$controller</span> . '/' . <span>$tpl</span><span>; } </span><span>function</span> url(<span>$path</span><span>) { </span><span>return</span> Url::gen(<span>$path</span><span>); }</span>
使用:
<span>html> </span><span><?</span><span>php include_tpl('Public', 'Public', 'header.php');</span><span>?></span> <span><</span><span>body</span><span>></span> <span><</span><span>h1</span><span>></span>Hello!<span></</span><span>h1</span><span>></span> <span><</span><span>a </span><span>href</span><span>="<?php url('/demo/foo/bar?productName=testpro');?>"</span><span>></span> <span></</span><span>body</span><span>></span> <span></</span><span>html</span><span>></span>
這兩個函數(shù)定義在app/Resource/functions.php文件中,你可以在這個文件中自定義你需要的視圖函數(shù)。
3.4 響應(yīng)
可以在控制器中通過調(diào)用App對象的getMinorResponse()方法來獲取當(dāng)前MinorResponse對象。 MinorResponse類提供了六個方法分別是:
<span>public function send(); // 用于將響應(yīng)對象發(fā)送給客戶端 public function setHeader($header);// 設(shè)置響應(yīng)頭 public function setContent($content); // 設(shè)置響應(yīng)對象的內(nèi)容 public function beforeContent($content); // 在當(dāng)前已有的內(nèi)容之前添加內(nèi)容 public function appendContent($content); // 在當(dāng)前已有內(nèi)容之后追加內(nèi)容 public function getContent(); // 獲取對象中的響應(yīng)內(nèi)容</span>
?

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Stock Market GPT
人工智能驅(qū)動投資研究,做出更明智的決策

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

PHP框架的選擇取決于項(xiàng)目需求和開發(fā)者技能:Laravel:功能豐富,社區(qū)活躍,但學(xué)習(xí)曲線陡峭,性能開銷高。CodeIgniter:輕量級,易于擴(kuò)展,但功能有限,文檔較少。Symfony:模塊化,社區(qū)強(qiáng)大,但復(fù)雜,性能問題。ZendFramework:企業(yè)級,穩(wěn)定可靠,但笨重,許可昂貴。Slim:微框架,速度快,但功能有限,學(xué)習(xí)曲線陡峭。

不同開發(fā)環(huán)境中PHP框架的性能存在差異。開發(fā)環(huán)境(例如本地Apache服務(wù)器)由于本地服務(wù)器性能較低和調(diào)試工具等因素,導(dǎo)致框架性能較低。相反,生產(chǎn)環(huán)境(例如功能齊全的生產(chǎn)服務(wù)器)具有更強(qiáng)大的服務(wù)器和優(yōu)化配置,使框架性能顯著提高。

PHP框架與微服務(wù)相結(jié)合的好處:可擴(kuò)展性:輕松擴(kuò)展應(yīng)用程序,添加新功能或處理更多負(fù)載。靈活性:微服務(wù)獨(dú)立部署和維護(hù),更容易進(jìn)行更改和更新。高可用性:一個微服務(wù)的故障不影響其他部分,確保更高可用性。實(shí)戰(zhàn)案例:使用Laravel和Kubernetes部署微服務(wù)步驟:創(chuàng)建Laravel項(xiàng)目。定義微服務(wù)控制器。創(chuàng)建Dockerfile。創(chuàng)建Kubernetes清單。部署微服務(wù)。測試微服務(wù)。

將PHP框架與DevOps集成可提高效率和敏捷性:自動化繁瑣任務(wù),釋放人員精力專注于戰(zhàn)略任務(wù)縮短發(fā)布周期,加快上市時(shí)間提高代碼質(zhì)量,減少錯誤增強(qiáng)跨職能團(tuán)隊(duì)協(xié)作,打破開發(fā)和運(yùn)營孤島

使用PHP框架集成人工智能(AI)以簡化AI在Web應(yīng)用程序中的集成,推薦框架:Laravel:輕量高效,功能強(qiáng)大。CodeIgniter:簡單易用,適用于小型應(yīng)用程序。ZendFramework:企業(yè)級框架,功能完善。AI集成方式:機(jī)器學(xué)習(xí)模型:執(zhí)行特定任務(wù)。AIAPI:提供預(yù)構(gòu)建功能。AI庫:處理AI任務(wù)。

PHP框架在敏捷開發(fā)和大型項(xiàng)目中應(yīng)用廣泛,提供敏捷性、可擴(kuò)展性和安全性等優(yōu)勢。例如,在電子商務(wù)網(wǎng)站中,Laravel框架可快速創(chuàng)建原型、處理復(fù)雜業(yè)務(wù)邏輯、確保安全和擴(kuò)展功能。通過利用預(yù)定義的組件和設(shè)計(jì)模式,PHP框架為開發(fā)人員構(gòu)建可擴(kuò)展且維護(hù)良好的應(yīng)用程序提供了便利。

PHP和Python框架在語言特性、框架生態(tài)和特點(diǎn)上有所不同。PHP主要用于Web開發(fā),易于學(xué)習(xí);Python具有廣泛的庫生態(tài)系統(tǒng)。流行的PHP框架包括Laravel、CodeIgniter、Symfony;Python框架包括Django、Flask、Web2py。實(shí)戰(zhàn)案例中,Laravel使用命令行生成博客模型和視圖,而Django使用DjangoAdmin和Python腳本創(chuàng)建博客。

在準(zhǔn)備Yii框架的面試時(shí),你需要了解以下關(guān)鍵知識點(diǎn):1.MVC架構(gòu):理解模型、視圖和控制器的協(xié)同工作。2.ActiveRecord:掌握ORM工具的使用,簡化數(shù)據(jù)庫操作。3.Widgets和Helpers:熟悉內(nèi)置組件和輔助函數(shù),快速構(gòu)建用戶界面。掌握這些核心概念和最佳實(shí)踐將幫助你在面試中脫穎而出。
