摘要:請(qǐng)求處理器可以理解為僅包含單個(gè)動(dòng)作的控制器,能夠使請(qǐng)求到響應(yīng)的流程更加清晰明確。一個(gè)好的使用例子是路由的請(qǐng)求處理在和框架中。控制器的動(dòng)作被分為多個(gè)獨(dú)立的請(qǐng)求處理器類,分別負(fù)責(zé)響應(yīng)單一的動(dòng)作。您是否應(yīng)當(dāng)使用請(qǐng)求處理器替換所有控制器可能不是。
在過去幾年中, PHP 開發(fā)環(huán)境發(fā)生了很大的變化。我們開始使用更多更好的設(shè)計(jì)模式,比如 DRY 和 SOLID) 設(shè)計(jì)模式原則。但為什么我們?nèi)匀辉谑褂每刂破鳎?/p>
如果您以前曾經(jīng)參與過大型項(xiàng)目的架構(gòu)編寫,那么您可能已經(jīng)注意到遲早會(huì)出現(xiàn)控制器過多的這種現(xiàn)象。即使您將控制器邏輯分離到各種類庫(kù)或服務(wù)類中,大量的依賴項(xiàng)和方法以及代碼的行數(shù)還是會(huì)隨著時(shí)間的推移不斷增長(zhǎng)。
我來介紹一下請(qǐng)求處理器。這個(gè)概念很簡(jiǎn)單,但很多 PHP 開發(fā)人員都不知道。請(qǐng)求處理器可以理解為僅包含單個(gè)動(dòng)作(Action)的控制器,能夠使請(qǐng)求到響應(yīng)的流程更加清晰明確。這個(gè)概念與 Paul M. Jones 提出的 Action-Domain-Responder 設(shè)計(jì)模式有相似之處,后者是MVC模式的替代品。
一個(gè)好的方法去建立請(qǐng)求處理器就是使用調(diào)用類??烧{(diào)用類是使用PHP中的魔術(shù)方法 __invoke ,把他們變成一個(gè) Callable ,這將允許他們作為函數(shù)調(diào)用。這里有一個(gè)關(guān)于調(diào)用類的簡(jiǎn)單例子:
class Greeting { public function __invoke($name) { echo "Hello " . $name; } } $welcome = new Greeting(); $welcome("John Doe"); //輸出 Hello John Doe
看到這里你大概會(huì)想;“我為什么要這樣做?”。我知道這是一個(gè)有點(diǎn)荒謬的例子。但是它與某些代碼一起使用時(shí)例如可調(diào)用對(duì)象和依賴注入,它將變得很有意義。一個(gè)好的使用例子是路由的請(qǐng)求處理在Laravel和Slim框架中。
Route::get("/{name}", Greeting::class);
是否讓你大吃一驚?沒有?讓我們把它和你通常寫的比較一下:
Route::get("/{name}", "SomeController@greeting");
還沒有?除了代碼好看之外,還有其他優(yōu)點(diǎn)。讓我們先去看看使用請(qǐng)求處理程序比控制器有那些優(yōu)點(diǎn)。
單一模式SOLID 的第一個(gè)原則是“單一模式”。在我看來,控制器中存在許多的方法,就打破了這個(gè)原則。請(qǐng)求處理程序提供了一個(gè)很好的解決方案,可以將這些操作分成它們自己的類,使它們更易于維護(hù),重構(gòu)和測(cè)試。
這是從 UsersController 中提取的2個(gè)請(qǐng)求處理程序的示例,它處理用戶配置文件的編輯和保存:
class EditUserHandler { public function __construct( UserRepository $repository, Twig $twig ) { ... } public function __invoke(Request $request, Response $response) { ... } } class UpdateUserHandler { public function __construct( UserRepository $repository, UpdateUserValidator $validator, ImageManager $resizer, Filesystem $storage ) { ... } public function __invoke(Request $request, Response $response) { ... } }
接下來讓我們看下一個(gè)優(yōu)勢(shì);
測(cè)試性能你最近有沒有為你的項(xiàng)目編寫過單元測(cè)試?在編寫單元測(cè)試的時(shí)候你可能編寫了一些與測(cè)試無關(guān)的模擬依賴項(xiàng)。由于請(qǐng)求處理器將不同的控制器操作拆分為多帶帶的類,因此您只需注入或綁定該動(dòng)作所需要的依賴項(xiàng)即可。
這是 Jeffrey Way 的一些建議?Twitter 。
提示:讓你的功能測(cè)試盡可能更加詳細(xì)具體,使用測(cè)試用例來描述重要的規(guī)則和能力。
這基本不會(huì)讓你的請(qǐng)求處理器都有一個(gè)測(cè)試文件。對(duì)于那些繁瑣的控制器測(cè)試文件來說是一個(gè)非常好的改進(jìn)。
重構(gòu)PhpStorm 和其他的編輯器都有強(qiáng)大的代碼重構(gòu)功能,但是如果你使用的是 Laravel 或者 Slim 框架默認(rèn)的路由方法將控制器綁定到路由,那么你可能會(huì)遇到這種問題。
例如重命名:
Route::get("/{name}", Greeting::class);
比這簡(jiǎn)單得很多:
Route::get("/{name}", "SomeController@greeting");結(jié)論
請(qǐng)求處理器是控制器很好的替代品??刂破鞯膭?dòng)作(Actions)被分為多個(gè)獨(dú)立的請(qǐng)求處理器類,分別負(fù)責(zé)響應(yīng)單一的動(dòng)作。這使整個(gè)項(xiàng)目的代碼更易于維護(hù)、重構(gòu)和測(cè)試。
您是否應(yīng)當(dāng)使用請(qǐng)求處理器替換所有控制器?可能不是。對(duì)于小型應(yīng)用程序而言,為了簡(jiǎn)單,將動(dòng)作組合成控制器或許更加合理。當(dāng)我開始在 Teamleader 工作后,我才開始發(fā)掘請(qǐng)求處理器,我覺得近期沒什么換回控制器的必要了。
如果有什么不清楚或有疑問,請(qǐng)?jiān)谙旅媪粝略u(píng)論告訴我,我會(huì)更新這篇文章。
轉(zhuǎn)自 PHP / Laravel 開發(fā)者社區(qū) https://laravel-china.org/top...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29890.html
摘要:每一條日志記錄也包含級(jí)別,代表對(duì)應(yīng)消息的嚴(yán)重程度。即格式化器,主要功能是確定最終輸出的形式和內(nèi)容。最好是日志能夠按自然天進(jìn)行記錄和分割。 上一章學(xué)習(xí)了自動(dòng)化測(cè)試,很好,現(xiàn)在我們可以絞盡腦汁寫出一份全面的測(cè)試,來保證代碼永遠(yuǎn)健康了。 話雖如此,但是作為一個(gè)獨(dú)立開發(fā)者很難寫出真正全面的測(cè)試代碼。這是因?yàn)橛脩粼谑褂媚愕木W(wǎng)站時(shí)可不會(huì)循規(guī)蹈矩,而是會(huì)以各種怪異的姿勢(shì)瀏覽網(wǎng)頁(yè)、上傳數(shù)據(jù)。但這也不是...
摘要:由于協(xié)議中沒有定義任何狀態(tài)碼,所以除非在某些試驗(yàn)條件下,服務(wù)器禁止向此類客戶端發(fā)送響應(yīng)。表示要完成請(qǐng)求,需要進(jìn)一步操作。 最近在廣州找工作,大四狗,讀著三本前兩年剛升二本的學(xué)校,文科生,好像一切條件都非常不利,但我還是毅然選擇這條路——拍黃片,人不能固步自封,還是要拓展一下自己的知識(shí)面,不能只學(xué)php而不拓展視野,還是要學(xué)學(xué)python、java、前端這些面試得有點(diǎn)心塞,各種因?yàn)閷W(xué)歷被...
摘要:我們先來看看構(gòu)造函數(shù)構(gòu)造函數(shù)就是用來實(shí)現(xiàn)攔截器的,這個(gè)構(gòu)造函數(shù)原型上有個(gè)方法。關(guān)于源碼,其實(shí)是比較簡(jiǎn)單的,都是用來操作該構(gòu)造函數(shù)的實(shí)例屬性的。存放攔截器方法,數(shù)組內(nèi)每一項(xiàng)都是有兩個(gè)屬性的對(duì)象,兩個(gè)屬性分別對(duì)應(yīng)成功和失敗后執(zhí)行的函數(shù)。 Axios源碼分析 - XHR篇 文章源碼托管在github上,歡迎fork指正! axios 是一個(gè)基于 Promise 的http請(qǐng)求庫(kù),可以用在瀏覽...
摘要:盡管如此,由于塊作用域的緣故,這段代碼還是能夠安全地運(yùn)行。塊作用域的顯式聲明如何避免上述問題呢答案是利用額外的一對(duì)大括號(hào)來做塊作用域的顯式聲明。 ES2015已經(jīng)定稿一年多了,想必大家早就用上let和const來充分利用塊作用域的優(yōu)勢(shì)了吧?那么,你們知道塊作用域都是怎么聲明的嗎? 在各種教程資料的例子里,塊作用域都是出現(xiàn)在for(……){……}/if(……){……}/while(……)...
摘要:也就是說用于設(shè)定與處理類間的映射關(guān)系。在中,默認(rèn)使用和函數(shù)分別處理兩種請(qǐng)求。因?yàn)楸韱稳蕴峤坏疆?dāng)前頁(yè)面,所以還是由處理。載入時(shí)間相關(guān)的的一個(gè)類,獲取當(dāng)前時(shí)間戳。獲取數(shù)據(jù)庫(kù)中的名為的。 前面的話 Demo1是一個(gè)簡(jiǎn)單的博客系統(tǒng)(=。=什么網(wǎng)站都叫系統(tǒng))。我們從這個(gè)簡(jiǎn)單的系統(tǒng)入手,去了解P+T+M網(wǎng)站的內(nèi)部邏輯,并記住一些規(guī)則,方便我們進(jìn)一步自己開發(fā)。 規(guī)則這個(gè)詞特意打上了雙引號(hào),目的是...
閱讀 2613·2021-09-26 10:17
閱讀 3236·2021-09-22 15:16
閱讀 2145·2021-09-03 10:43
閱讀 3270·2019-08-30 11:23
閱讀 3667·2019-08-29 13:23
閱讀 1315·2019-08-29 11:31
閱讀 3699·2019-08-26 13:52
閱讀 1404·2019-08-26 12:22