Debugging collections(譯)

注:本文是翻譯Freek Van der Herten寫的關於Collection
調試技巧,,讀完之後很實用,分享給你們.閱讀過程當中,翻譯有錯誤的但願你們指正,thx..
原文連接: https://murze.be/2016/06/debu...php

最近我一直在使用Laravel的collection,若是你還不瞭解collection,我簡單說下:一個collection(集合)就是一個‘功能強大’的數組,有不少強大處理其內部數據的函數.可是惟一讓我頭疼的地方是如何調試collection的鏈式操做,如下是我改善過的業務處理.

使用Collection類你可使用鏈式的方式,經過操做函數來處理數據,舉個例子以下(爲了讓代碼更簡短,我把函數體中的具體實現給省略了)

collect($items)
  ->filter(function() { 
     ... 
   })
   ->unique(function() { 
      ... 
   })
   ->map(function() {
     ... 
   })
   ->sortBy(function() { 
      ...
   });

想象一下若是你須要調試這段代碼,你想要獲取map函數的返回值,你會怎麼作?那麼你可能會用dd()把這'整個操做'包起來,得出返回值.

dd(collect($items)
      ->filter(function() { 
         ... 
       })
       ->unique(function() { 
          ... 
       })
       ->map(function() {
         ... 
       }))
       ->sortBy(function() { 
          ...
       });

的確,這樣足夠了,整個操做的返回值也能打印出來,可是仍是有點瑣碎,你必需要要在每次測試操做的開始和結尾加點東西(開頭:'dd(',結尾:')'),我以爲這樣可讀性上不太好.而且移動dd語句測試也是很麻煩,結尾的括號又特別容易被忽略,so,雖然我看似解決了這個問題,可是我敢保證若是像這樣調試的話,你很快就以爲很繁瑣.ok,實際上是有解決方案的.

laravel的Collection類是Macroable(暫且譯爲:可擴展的),這意味着咱們能夠在運行時添加相應的函數.爲了提升咱們調試流程,咱們能夠建立簡單的dd macro:

Collection::macro('dd', function () {
    dd($this);
});

爲了能在項目中使用這個函數,須要將以上代碼放到服務提供者中.ok,以下,看下這個Blender--咱們的laravel模板,舉個例子

使用macro debugging調試Collection,對於咱們來講變得很簡單了.ok,咱們來看看它如何使用.

collect($items)
  ->filter(function() { 
     ... 
   })
   ->unique(function() { 
      ... 
   })
   ->map(function() {
     ... 
   })
   ->dd()
   ->sortBy(function() { 
      ...
   });

爲了測試特定鏈式操做的返回值,你能夠將'->dd()'放到該操做的最後便可,這樣一來,相比較直接'dd(....)',可讀性就高了.在完成調試後,咱們只需把鏈式操做尾部的代碼去掉便可.還有你可用使用PHPStrom的快捷鍵'alt+shift+arrow-up' 和'alt+shift+arrow-down'能夠將'->dd()'部分更方便移到前一個或下一個鏈式操做以後.

結語

你還能夠去看Laravel的官方文檔和Refactoring to Collection

試讀篇章中文版:Refactoring to Collection

相關文章
相關標籤/搜索