成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

跟控制器說再見吧,從今天開始使用請(qǐng)求處理器(Request Handlers) 范式

brianway / 3314人閱讀

摘要:請(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

相關(guān)文章

  • Django搭建個(gè)人博客:日志記錄

    摘要:每一條日志記錄也包含級(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ù)。但這也不是...

    Lowky 評(píng)論0 收藏0
  • PHP工程師面試題+筆試題

    摘要:由于協(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é)歷被...

    v1 評(píng)論0 收藏0
  • Axios源碼深度剖析 - AJAX新王者

    摘要:我們先來看看構(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ù),可以用在瀏覽...

    DangoSky 評(píng)論0 收藏0
  • 從今開始使用javascript的塊作用域顯式聲明

    摘要:盡管如此,由于塊作用域的緣故,這段代碼還是能夠安全地運(yùn)行。塊作用域的顯式聲明如何避免上述問題呢答案是利用額外的一對(duì)大括號(hào)來做塊作用域的顯式聲明。 ES2015已經(jīng)定稿一年多了,想必大家早就用上let和const來充分利用塊作用域的優(yōu)勢(shì)了吧?那么,你們知道塊作用域都是怎么聲明的嗎? 在各種教程資料的例子里,塊作用域都是出現(xiàn)在for(……){……}/if(……){……}/while(……)...

    gaosboy 評(píng)論0 收藏0
  • Tornado 簡(jiǎn)單入門教程(一)——Demo1

    摘要:也就是說用于設(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),目的是...

    solocoder 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<