注:本文是翻译Freek Van der Herten写的关于Collection
调试技巧,,读完以后很实用,分享给大家.阅读过程中,翻译有错误的希望大家指正,thx..
原文链接: https://murze.be/2016/06/debu...

最近我一直在使用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


lcoding
317 声望40 粉丝

The quality of code is everything...