注:本文是翻译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() {
...
});