这篇文章,我们将讨论Laravel中的tap。我们将详细讨论tap辅助函数和集合的tap方法。Tap辅助函数旧实现Laravel提出了一个tap函数。这是一个非常奇怪的特性,灵感来自于Ruby。这是tap助手功能的基本实现。函数tap($value,$callback){$callback($value);return$value;}上面的代码将接受一个调用匿名函数的参数。调用回调函数后,会返回参数。让我们看看如何以有意义的方式使用它。例如:validated=true;$photo->save();});在上面的示例中,我们传递了一个参数(照片模型)和一个回调函数,该函数仅将validated设置为true并保存模型。然后此函数将照片模型实例返回给调用者。新实现在Laravel5.4和Laravel5.5的最新版本中,更高级的水龙头已经到来。它引入了更短的用法。这是tap函数的新实现。functiontap($value,$callback=null){if(is_null($callback)){returnnewHigherOrderTapProxy($value);}$回调($值);return$value;}回调函数现在是可选的。也可以在参数中串接多个方法,其实就是photoModel中支持的方法。例如update(['validated'=>'true',])我们可以通过tap传输链接任何模型方法。这个update方法一般会返回true或者false,但是这里使用了tap函数。在这种情况下,它将返回照片模型。tap可以帮助您返回作为参数传递的对象。工作原理Tap是一个非常有用的功能,但有时很难理解它的工作原理。这是它的工作原理。如果没有给出回调函数,因为它是可选的,Laravel将返回一个新的HigherOrderTapProxy实例。调用魔术方法在HigherOrderTapProxy类中定义。调用魔术方法是由语言动态调用的(所谓的方法不是在类中定义的)。由于HigherOrderTapProxy类中除了调用魔术方法外没有定义任何方法,因此每次使用tap函数调用任何方法时都会调用它。在调用魔术方法中,我们的更新方法或我们调用的任何方法将使用参数调用,它将返回我们最初传递给tap函数的参数。下面是实际调用HigherOrderTapProxy类中的魔术方法的内容。//vendor/laravel/framework/src/Illuminate/Support/HigherOrderTapProxy.phppublicfunction__call($method,$parameters){$this->target->{$method}(...$parameters);return$this->target;}上面代码中,target属性就是我们在tap中传入的参数。Laravel集合中的tap方法Laravel在集合类中也有一个tap方法,它允许你传递参数在特定的地方点击并处理结果。tap不影响主集合的结果。这对于调试代码和查找集合出错的位置非常有帮助。我们用一个例子来解释这个方法。初始化以下数组。$photos=[['file_name'=>'wallpaper','validated'=>true,'extension'=>'jpg'],['file_name'=>'spring','validated'=>true,'extension'=>'png'],['file_name'=>'flowers','validated'=>false,'extension'=>'jpg'],['file_name'=>'mac','validated'=>true,'extension'=>'png'],['file_name'=>'books','validated'=>false,'extension'=>'jpg'],['file_name'=>'mobiles','validated'=>false,'extension'=>'jpg'],['file_name'=>'glass','validated'=>false,'extension'=>'png'],['file_name'=>'fruit','validated'=>true,'extension'=>'jpg'],];现在让我们尝试在这个数组上使用tap方法。首先,我们要把这个数组转换成一个集合,然后在某些点上挖掘这个集合。returncollect($photos)->where('validated',true)->tap(function($validated){返回var_dump($validated->pluck('file_name'));});});上面的代码会输出如下结果:wallpaperspringmacfruittapVSPipe(管道)在Laravel中,有一个类似的方法叫做pipeline。它们在都用于收集管道的意义上是相似的。水龙头和水管是有区别的。tap允许您在不修改原始返回值的情况下使用数据。另一方面,管道根据返回值修改数据。例如:returncollect($photos)->where('validated',true)->pipe(function($validated){return$validated->where('extension','jpg')->pluck('file_name');});});输出是wallpaperfruit另一方面,如果我们像这样使用上面的代码:returncollect($photos)->where('validated',true)->tap(function($validated){('扩展名','jpg')->pluck('文件名');});});它将返回验证设置为true的所有照片的数组。结果是0:{file_name:"wallpaper",validated:true,extension:"jpg"},1:{file_name:"spring",validated:true,extension:"png"},3:{file_name:"mac",validated:true,extension:"png"},7:{file_name:"fruit",validated:true,extension:"jpg"}更多PHP知识请前往PHPCasts
