国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

brianway / 3307人閱讀

摘要:請求處理器可以理解為僅包含單個動作的控制器,能夠使請求到響應的流程更加清晰明確。一個好的使用例子是路由的請求處理在和框架中??刂破鞯膭幼鞅环譃槎鄠€獨立的請求處理器類,分別負責響應單一的動作。您是否應當使用請求處理器替換所有控制器可能不是。

在過去幾年中, PHP 開發環境發生了很大的變化。我們開始使用更多更好的設計模式,比如 DRY 和 SOLID) 設計模式原則。但為什么我們仍然在使用控制器?

如果您以前曾經參與過大型項目的架構編寫,那么您可能已經注意到遲早會出現控制器過多的這種現象。即使您將控制器邏輯分離到各種類庫或服務類中,大量的依賴項和方法以及代碼的行數還是會隨著時間的推移不斷增長。

我來介紹一下請求處理器。這個概念很簡單,但很多 PHP 開發人員都不知道。請求處理器可以理解為僅包含單個動作(Action)的控制器,能夠使請求到響應的流程更加清晰明確。這個概念與 Paul M. Jones 提出的 Action-Domain-Responder 設計模式有相似之處,后者是MVC模式的替代品。

一個好的方法去建立請求處理器就是使用調用類??烧{用類是使用PHP中的魔術方法 __invoke ,把他們變成一個 Callable ,這將允許他們作為函數調用。這里有一個關于調用類的簡單例子:

class Greeting
{
    public function __invoke($name)
    {
        echo "Hello " . $name;
    }
}

$welcome = new Greeting();
$welcome("John Doe"); //輸出 Hello John Doe

看到這里你大概會想;“我為什么要這樣做?”。我知道這是一個有點荒謬的例子。但是它與某些代碼一起使用時例如可調用對象和依賴注入,它將變得很有意義。一個好的使用例子是路由的請求處理在Laravel和Slim框架中。

Route::get("/{name}", Greeting::class);

是否讓你大吃一驚?沒有?讓我們把它和你通常寫的比較一下:

Route::get("/{name}", "SomeController@greeting");

還沒有?除了代碼好看之外,還有其他優點。讓我們先去看看使用請求處理程序比控制器有那些優點。

單一模式

SOLID 的第一個原則是“單一模式”。在我看來,控制器中存在許多的方法,就打破了這個原則。請求處理程序提供了一個很好的解決方案,可以將這些操作分成它們自己的類,使它們更易于維護,重構和測試。

這是從 UsersController 中提取的2個請求處理程序的示例,它處理用戶配置文件的編輯和保存:

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)
    {
        ...
    }
}

接下來讓我們看下一個優勢;

測試性能

你最近有沒有為你的項目編寫過單元測試?在編寫單元測試的時候你可能編寫了一些與測試無關的模擬依賴項。由于請求處理器將不同的控制器操作拆分為多帶帶的類,因此您只需注入或綁定該動作所需要的依賴項即可。

這是 Jeffrey Way 的一些建議?Twitter 。

提示:讓你的功能測試盡可能更加詳細具體,使用測試用例來描述重要的規則和能力。

這基本不會讓你的請求處理器都有一個測試文件。對于那些繁瑣的控制器測試文件來說是一個非常好的改進。

重構

PhpStorm 和其他的編輯器都有強大的代碼重構功能,但是如果你使用的是 Laravel 或者 Slim 框架默認的路由方法將控制器綁定到路由,那么你可能會遇到這種問題。

例如重命名:

Route::get("/{name}", Greeting::class);

比這簡單得很多:

Route::get("/{name}", "SomeController@greeting");
結論

請求處理器是控制器很好的替代品??刂破鞯膭幼鳎?b>Actions)被分為多個獨立的請求處理器類,分別負責響應單一的動作。這使整個項目的代碼更易于維護、重構和測試。

您是否應當使用請求處理器替換所有控制器?可能不是。對于小型應用程序而言,為了簡單,將動作組合成控制器或許更加合理。當我開始在 Teamleader 工作后,我才開始發掘請求處理器,我覺得近期沒什么換回控制器的必要了。

如果有什么不清楚或有疑問,請在下面留下評論告訴我,我會更新這篇文章。

轉自 PHP / Laravel 開發者社區 https://laravel-china.org/top...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29890.html

相關文章

  • Django搭建個人博客:日志記錄

    摘要:每一條日志記錄也包含級別,代表對應消息的嚴重程度。即格式化器,主要功能是確定最終輸出的形式和內容。最好是日志能夠按自然天進行記錄和分割。 上一章學習了自動化測試,很好,現在我們可以絞盡腦汁寫出一份全面的測試,來保證代碼永遠健康了。 話雖如此,但是作為一個獨立開發者很難寫出真正全面的測試代碼。這是因為用戶在使用你的網站時可不會循規蹈矩,而是會以各種怪異的姿勢瀏覽網頁、上傳數據。但這也不是...

    Lowky 評論0 收藏0
  • PHP工程師面試題+筆試題

    摘要:由于協議中沒有定義任何狀態碼,所以除非在某些試驗條件下,服務器禁止向此類客戶端發送響應。表示要完成請求,需要進一步操作。 最近在廣州找工作,大四狗,讀著三本前兩年剛升二本的學校,文科生,好像一切條件都非常不利,但我還是毅然選擇這條路——拍黃片,人不能固步自封,還是要拓展一下自己的知識面,不能只學php而不拓展視野,還是要學學python、java、前端這些面試得有點心塞,各種因為學歷被...

    v1 評論0 收藏0
  • Axios源碼深度剖析 - AJAX新王者

    摘要:我們先來看看構造函數構造函數就是用來實現攔截器的,這個構造函數原型上有個方法。關于源碼,其實是比較簡單的,都是用來操作該構造函數的實例屬性的。存放攔截器方法,數組內每一項都是有兩個屬性的對象,兩個屬性分別對應成功和失敗后執行的函數。 Axios源碼分析 - XHR篇 文章源碼托管在github上,歡迎fork指正! axios 是一個基于 Promise 的http請求庫,可以用在瀏覽...

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

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

    gaosboy 評論0 收藏0
  • Tornado 簡單入門教程(一)——Demo1

    摘要:也就是說用于設定與處理類間的映射關系。在中,默認使用和函數分別處理兩種請求。因為表單仍提交到當前頁面,所以還是由處理。載入時間相關的的一個類,獲取當前時間戳。獲取數據庫中的名為的。 前面的話 Demo1是一個簡單的博客系統(=。=什么網站都叫系統)。我們從這個簡單的系統入手,去了解P+T+M網站的內部邏輯,并記住一些規則,方便我們進一步自己開發。 規則這個詞特意打上了雙引號,目的是...

    solocoder 評論0 收藏0

發表評論

0條評論

brianway

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<