资讯专栏INFORMATION COLUMN

Laravel 中强大的tap你用过么

junfeng777 / 1398人阅读

摘要:在调用回调函数后,它将返回参数。例如在上面的例子中,我们传递一个参数照片模型和一个回调函数,该函数简单地将设置为并保存模型。如果没有给出回调函数,因为它是可选的,将返回的新实例。允许你使用数据,但不会修改原始返回值。

在本文,我们将讨论 Laravel 中的 tap。我们将详细讨论 tap 帮助函数和 collection 中的 tap 方法。

Tap 帮助函数 旧的实现方式

Laravel提出了一个 tap 功能。这是一个非常奇怪的功能,受Ruby的启发。这是 tap 助手功能的基本实现。

function tap($value, $callback)
{
    $callback($value);

    return $value;
}

上面的代码将接受一个参数,它将使用该参数调用一个匿名函数。在调用回调函数后,它将返回参数。
让我们看看我们如何以有意义的方式使用它。例如:

validated = true;
    $photo->save();
});

在上面的例子中,我们传递一个参数(照片模型)和一个回调函数,该函数简单地将 validated 设置为 true 并保存模型。这个函数然后将照片模型实例返回给调用者。

新的实现方式

在最新版本的Laravel 5.4和Laravel 5.5中,更高级的 tap 来了。它引入了更短的使用方式。这里是 tap 函数的新实现。

function tap($value, $callback = null)
{
    if (is_null($callback)) {
        return new HigherOrderTapProxy($value);
    }

    $callback($value);

    return $value;
}

回调函数现在是可选的。你还可以链式使用参数中的多个方法,这里其实也就是照片Model中支持的方法。例如

update([
    "validated" => "true",
])

我们能够将任何模型的方法通过 tap 链式调用。此更新方法通常返回 truefalse,但是这里使用了 tap 函数。在这种情况下,它将返回照片模型。tap 可以帮助你返回作为参数传递的对象。

它是如何工作的

tap 是一个非常有用的功能,但有时它很难理解它是如何工作的。 这里来解释它是如何工作的。

如果没有给出回调函数,因为它是可选的,Laravel将返回 HigherOrderTapProxy 的新实例。 在 HigherOrderTapProxy 类中定义了调用魔术方法。 调用魔术方法是由语言动态调用的(所谓的方法在类中没有定义)。 因为除了调用魔术方法,HigherOrderTapProxy 类中没有定义方法,所以每次使用 tap 函数任何方法调用时都会调用它。 在调用魔术方法中,我们的更新方法或任何我们调用的方法将被参数调用,并且它将返回我们最初传递给 tap 函数的参数。

这里是 HigherOrderTapProxy 类中调用魔术方法的实际内容。

// vendor/laravel/framework/src/Illuminate/Support/HigherOrderTapProxy.php
public function __call($method, $parameters)
{
    $this->target->{$method}(...$parameters);

    return $this->target;
}

在上面的代码中,target 属性是我们在tap中传递的参数。

Laravel collection 中的 tap 方法

Laravel还在 collection 类中有一个 tap 方法,可让你在特定的地方传入参数到 tap中,并对这些结果进行处理。tap 不会影响主要 collection 的结果。 这对调试代码和查找在处理集合时出现错误的地方很有帮助。
我们用一个例子来解释这个方法。 初始化以下数组。

$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 方法。首先,我们必须将这个数组转换为一个集合,然后在特定点处 tap 这个集合。

return collect($photos)
    ->where("validated", true)
    ->tap(function ($validated) {
        return var_dump($validated->pluck("file_name"));
    });
});

上面的代码将会输出以下结果:

wallpaper
spring
mac
fruit
tap VS Pipe(管道)

在Laravel中,也有类似的方法叫管道。 它们在某种意义上是相似的,因为它们都在集合管道中使用。 tappipe 之间有一个区别。 tap 允许你使用数据,但不会修改原始返回值。 另一方面,pipe 根据返回值修改数据。
例如:

return collect($photos)
    ->where("validated", true)
    ->pipe(function ($validated) {
        return $validated->where("extension", "jpg")->pluck("file_name");
    });
});

输出结果为

wallpaper
fruit

另一方面,如果我们像这样使用上面的代码:

return collect($photos)
    ->where("validated", true)
    ->tap(function ($validated) {
        return $validated->where("extension", "jpg")->pluck("file_name");
    });
});

它将返回验证设置为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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31985.html

相关文章

  • 5 个非常有用 Laravel Blade 指令,用过哪些?

    摘要:接下来我将带大家认识下五个指令,这些指令将让你在解决特定问题时如虎添翼。如果你是刚接触的用户,这些小技巧能带你认识到模板引擎的便捷与高效。 showImg(https://segmentfault.com/img/remote/1460000015076241); 接下来我将带大家认识下五个 Laravel Blade 指令,这些指令将让你在解决特定问题时如虎添翼。如果你是刚接触 La...

    stefan 评论0 收藏0
  • 一个 16年毕业生所经历 PHP 面试

    摘要:正确做法是给加索引,还有联合索引,并不能避免全表扫描。 前言:有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连 有心的同学应该会看到我这个noteBook下面的其它知识,希望对你们有些许帮助。 本文地址 时间点:2017-11 一个16年毕业生所经历的php面试 一、什么是面试 二、面试准备 1. 问:什么时候开始准备? 2. 问:怎么准备? 三、面试...

    dabai 评论0 收藏0
  • Laravel 5 系列入门教程(二)【最适合国人 Laravel 教程】

    摘要:原文发表在我的个人网站系列入门教程二最适合中国人的教程本教程示例代码见大家在任何地方卡住,最快捷的解决方式就是去看我的示例代码。 原文发表在我的个人网站:Laravel 5 系列入门教程(二)【最适合中国人的 Laravel 教程】 本教程示例代码见:https://github.com/johnlui/Learn-Laravel-5 大家在任何地方卡住,最快捷...

    未东兴 评论0 收藏0
  • 十五个常用 Laravel 集合(Collection)

    摘要:将返回通过回调真值测试的第一个项的键。方法将集合分割为多个给定大小的较小集合。它可用于在任何位置的调试和查找集合内的内容。方法用于遍历整个集合。这对集合同样有效。它将导致由第二个参数的值作为键的集合。它接受回调并传递并将集合传递给它。 showImg(https://segmentfault.com/img/remote/1460000018924972); 文章转自:https://...

    alphahans 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<