laravel辅助函数tap的使用方法

被门夹过的核桃还能补脑嘛
Laravel 5.3 中增加了一个新的全局帮助函数 tap(),改进了框架的声明能力。这个微妙的语法是从 Ruby 和 Lodash 借鉴而来,允许你去 tap 成链。 先看看 tap() 帮助函数的代码,只有短短的几行: Laravel5.3的tap
1
2
3
4
5
6
function tap($value, $callback)
{
$callback($value);

return $value;
}

Laravel5.4的tap

1
2
3
4
5
6
7
8
9
10
function tap($value, $callback = null)
{
if (is_null($callback)) {
return new HigherOrderTapProxy($value);
}

$callback($value);

return $value;
}

你需要传一个值和一个回调到方法中,值作为回调的参数,回调将执行,最后值被返回。

第一种情况

默认情况下会返回一bool值

1
2
3
$user = \App\Models\User::query()->find(1);
$res = $user->update(['name' => 'yangzie']);
dd($res); // true

返回user实例

1
2
3
$user = \App\Models\User::query()->find(1);
$res = tap($user)->update(['name' => 'yangzie']);
dd($res);

第二种情况

返回user实例

1
2
3
4
5
$name = '樊雨薇';
return tap(\App\Models\User::query()->find(1), function ($instance) use ($name){
$instance->name = $name;
$instance->save();
});

第三种情况

让我们看看 Illuminate\Cache\Repository 下的 pull 方法,此函数将从指定键的缓存中获取值,并将其删除。pull 方法的实现:

1
2
3
4
5
6
7
8
public function pull($key, $default = null)
{
$value = $this->get($key, $default);

$this->forget($key) // returns a boolean;

return $value;
}

上面的例子中,$this-> forget() 返回一个布尔值,所以要使我们的函数返回原始值,需要将其储存到临时变量 $value 中。以下是 tap() 的实现,不再需要临时变量:

1
2
3
4
5
6
public function pull($key, $default = null)
{
return tap($this->get($key, $default), function ($value) use ($key) {
$this->forget($key);
});
}

第四种情况

vendor\laravel\framework\src\Illuminate\View\Factory.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public function make($view, $data = [], $mergeData = [])
{
$path = $this->finder->find(
$view = $this->normalizeName($view)
);

// 这里是视图文件的绝对路径
// D:\phpStudy\WWW\ccerp-v2\resources\views/home.blade.php


// Next, we will create the view instance and call the view creator for the view
// which can set any data, etc. Then we will return the view instance back to
// the caller for rendering or performing other view manipulations on this.
$data = array_merge($mergeData, $this->parseData($data));


// 注意 tap 辅助函数的用法, 最后返回的是 view 实例
// $this->viewInstance($view, $path, $data) 生成一个新的 view 实例, 闭包传递的$view就是这个view实例

return tap($this->viewInstance($view, $path, $data), function ($view) {
$this->callCreator($view);
});
}

http://derekmd.com/2017/02/laravel-tap/?utm_source=learninglaravel.net
https://pigjian.com/article/laravel-tap-the-usage