摘要:中也可以在类中使用方法。这里有一个例子,用于网站支持英语和法语。取代月份的语言翻译文件,使用列出一年每个月份的。使用处理控制台命令进度条这是在集合中最典型的用例。
本文参照转译:
http://derekmd.com/2017/02/la...
https://murze.be/2017/02/lara...
Laravel 5.3 中增加了一个新的全局帮助函数 tap(),改进了框架的声明能力。这个微妙的语法是从 Ruby 和 Lodash 借鉴而来,允许你去 tap 成链。
先看看 tap() 帮助函数的代码,只有短短的几行:
function tap($value, $callback) { $callback($value); return $value; }
你需要传一个值和一个回调到方法中,值作为回调的参数,回调将执行,最后值被返回。
执行中间操作从一个简单的例子开始,提取 Laravel 的 AuthenticateSession@handle() 的一些代码,一些 PHP 开发者非常熟悉的解决方案:
$response = $next($request); $this->storePasswordHashInSession($request); return $response;
使用 tap() 帮助函数:
return tap($next($request), function () use ($request) { $this->storePasswordHashInSession($request); });
另外的一个简单的例子,让我们看看 IlluminateCacheRepository 下的 pull 方法,此函数将从指定键的缓存中获取值,并将其删除。pull 方法的实现:
public function pull($key, $default = null) { $value = $this->get($key, $default); $this->forget($key) // returns a boolean; return $value; }
上面的例子中,$this-> forget() 返回一个布尔值,所以要使我们的函数返回原始值,需要将其储存到临时变量 $value 中。以下是 tap() 的实现,不再需要临时变量:
public function pull($key, $default = null) { return tap($this->get($key, $default), function ($value) use ($key) { $this->forget($key); }); }恢复状态
Eloquent 的 create 和 update 方法支持 ["timestamps" => false] 选项。如果这被实现成链式方法,结果的可读性会更好。
// Method defined in AppModel that AppMessage extends. public function keepingTimestamps(callable $callback) { try { $timestamps = $this->timestamps; $this->timestamps = false; return tap($this, $callback); } finally { $this->timestamps = $timestamps; } }
现在 Message 模型可以链式使用以上的方法:
request()->user()->latestMessage->keepingTimestamps(function ($message) { $message->markRead(); // updates a "read_at" timestamp instead }); // returns the latestMessage
如果你写的代码有 DB::transaction() 相同的模式,你可以在 Laravel 5.4 使用 tap() 帮助函数重写。
CollectionLaravel 5.4 中也可以在 Collection 类中使用 tap() 方法。你可以在任何地方使用,而不需要破坏链式。对于 Laravel 5.3 及更早的版本,你只需要复制粘贴五行代码的方法作为 Collection macro 到你项目的 AppServiceProvider@boot() 即可。
这里有一个例子,用于 Laravel 网站支持英语和法语。取代月份的语言翻译文件,使用 Carbon 列出一年每个月份的 。因此这个模型的修饰方法:
public function monthOptions() { return collect(range(1, 12)) ->keyByValue() // custom Collection macro ->tap(function () { if (App::getLocale() === "fr") { setlocale(LC_TIME, "fr_CA"); } }) ->map(function ($month) { return sprintf("%02d - %s", $month, Carbon::now()->month($month)->formatLocalized("%B")); }) ->tap(function () { if (App::getLocale() === "fr") { setlocale(LC_TIME, ""); } }); }
对于更多的语言支持,设置/恢复状态将提取到其他方法,使其更加可读。
使用 Collection tap() 处理控制台命令进度条这是在集合中最典型的用例。你甚至可以在 handle() 处理过程中保持其方法链。
public function handle() { Club::findOrFail($this->option("club")) ->members() ->subscribed() ->get() ->tap(function ($members) { $this->output->progressStart($members->count()); }) ->each(function ($member) { Mail::to($member)->queue(new Newsletter($member, $this->matchReport()); $this->output->progressAdvance(); }) ->tap(function () { $this->output->progressFinish(); }); } public function matchReport() { return once(function () { return MatchReport::ofRound($this->option("round"))->firstOrFail(); }); }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/22393.html
摘要:在调用回调函数后,它将返回参数。例如在上面的例子中,我们传递一个参数照片模型和一个回调函数,该函数简单地将设置为并保存模型。如果没有给出回调函数,因为它是可选的,将返回的新实例。允许你使用数据,但不会修改原始返回值。 在本文,我们将讨论 Laravel 中的 tap。我们将详细讨论 tap 帮助函数和 collection 中的 tap 方法。 Tap 帮助函数 旧的实现方式 Lara...
摘要:将返回通过回调真值测试的第一个项的键。方法将集合分割为多个给定大小的较小集合。它可用于在任何位置的调试和查找集合内的内容。方法用于遍历整个集合。这对集合同样有效。它将导致由第二个参数的值作为键的集合。它接受回调并传递并将集合传递给它。 showImg(https://segmentfault.com/img/remote/1460000018924972); 文章转自:https://...
摘要:文章转自包含各种全局辅助函数。返回应用程序中公共目录的完全限定的绝对路径。要解决此问题,只需运行以下命令即可使用包函数将字符串转换为复数形式。该值将被传递给闭包,然后该值将被返回。方法返回布尔值,但由于用了,所以它将返回。 showImg(https://segmentfault.com/img/remote/1460000018944915?w=1408&h=846); 文章转自:h...
摘要:要解决此问题,只需运行以下命令即可使用包函数将字符串转换为复数形式。函数接受两个参数一个值和一个闭包。该值将被传递给闭包,然后该值将被返回。更新方法返回布尔值,但由于用了,所以它将返回。这对调试非常有用。函数根据给定的字符串生成一个友好的。 Laravel包含各种全局辅助函数(helper), 你可以使用它们使开发工作流程更加轻松。 在这里,我将会列一下10个最好的 Laravel h...
摘要:函数允许你将多维数组转换为使用点符号的一维数组。返回应用程序中公共目录的完全限定的绝对路径。要解决此问题,只需运行以下命令即可使用包将字符串转换为复数形式。接受两个参数一个值和一个闭包。该值将被传递给闭包,然后该值将被返回。 array_dot() 函数允许你将多维数组转换为使用点符号的一维数组。 $array = [ user => [username => somethin...
阅读 2122·2021-11-23 09:51
阅读 2866·2021-11-22 15:35
阅读 2964·2019-08-30 15:53
阅读 1060·2019-08-30 14:04
阅读 3298·2019-08-29 12:39
阅读 1830·2019-08-28 17:57
阅读 1124·2019-08-26 13:39
阅读 570·2019-08-26 13:34