摘要:在調(diào)用回調(diào)函數(shù)后,它將返回參數(shù)。例如在上面的例子中,我們傳遞一個參數(shù)照片模型和一個回調(diào)函數(shù),該函數(shù)簡單地將設(shè)置為并保存模型。如果沒有給出回調(diào)函數(shù),因為它是可選的,將返回的新實例。允許你使用數(shù)據(jù),但不會修改原始返回值。
在本文,我們將討論 Laravel 中的 tap。我們將詳細(xì)討論 tap 幫助函數(shù)和 collection 中的 tap 方法。
Tap 幫助函數(shù) 舊的實現(xiàn)方式Laravel提出了一個 tap 功能。這是一個非常奇怪的功能,受Ruby的啟發(fā)。這是 tap 助手功能的基本實現(xiàn)。
function tap($value, $callback) { $callback($value); return $value; }
上面的代碼將接受一個參數(shù),它將使用該參數(shù)調(diào)用一個匿名函數(shù)。在調(diào)用回調(diào)函數(shù)后,它將返回參數(shù)。
讓我們看看我們?nèi)绾我杂幸饬x的方式使用它。例如:
validated = true; $photo->save(); });
在上面的例子中,我們傳遞一個參數(shù)(照片模型)和一個回調(diào)函數(shù),該函數(shù)簡單地將 validated 設(shè)置為 true 并保存模型。這個函數(shù)然后將照片模型實例返回給調(diào)用者。
新的實現(xiàn)方式在最新版本的Laravel 5.4和Laravel 5.5中,更高級的 tap 來了。它引入了更短的使用方式。這里是 tap 函數(shù)的新實現(xiàn)。
function tap($value, $callback = null) { if (is_null($callback)) { return new HigherOrderTapProxy($value); } $callback($value); return $value; }
回調(diào)函數(shù)現(xiàn)在是可選的。你還可以鏈?zhǔn)绞褂脜?shù)中的多個方法,這里其實也就是照片Model中支持的方法。例如
update([ "validated" => "true", ])
我們能夠?qū)⑷魏文P偷姆椒ㄍㄟ^ tap 鏈?zhǔn)秸{(diào)用。此更新方法通常返回 true 或 false,但是這里使用了 tap 函數(shù)。在這種情況下,它將返回照片模型。tap 可以幫助你返回作為參數(shù)傳遞的對象。
它是如何工作的tap 是一個非常有用的功能,但有時它很難理解它是如何工作的。 這里來解釋它是如何工作的。
如果沒有給出回調(diào)函數(shù),因為它是可選的,Laravel將返回 HigherOrderTapProxy 的新實例。 在 HigherOrderTapProxy 類中定義了調(diào)用魔術(shù)方法。 調(diào)用魔術(shù)方法是由語言動態(tài)調(diào)用的(所謂的方法在類中沒有定義)。 因為除了調(diào)用魔術(shù)方法,HigherOrderTapProxy 類中沒有定義方法,所以每次使用 tap 函數(shù)任何方法調(diào)用時都會調(diào)用它。 在調(diào)用魔術(shù)方法中,我們的更新方法或任何我們調(diào)用的方法將被參數(shù)調(diào)用,并且它將返回我們最初傳遞給 tap 函數(shù)的參數(shù)。
這里是 HigherOrderTapProxy 類中調(diào)用魔術(shù)方法的實際內(nèi)容。
// vendor/laravel/framework/src/Illuminate/Support/HigherOrderTapProxy.php public function __call($method, $parameters) { $this->target->{$method}(...$parameters); return $this->target; }
在上面的代碼中,target 屬性是我們在tap中傳遞的參數(shù)。
Laravel collection 中的 tap 方法Laravel還在 collection 類中有一個 tap 方法,可讓你在特定的地方傳入?yún)?shù)到 tap中,并對這些結(jié)果進(jìn)行處理。tap 不會影響主要 collection 的結(jié)果。 這對調(diào)試代碼和查找在處理集合時出現(xiàn)錯誤的地方很有幫助。
我們用一個例子來解釋這個方法。 初始化以下數(shù)組。
$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"], ];
現(xiàn)在讓我們嘗試在這個數(shù)組上使用 tap 方法。首先,我們必須將這個數(shù)組轉(zhuǎn)換為一個集合,然后在特定點處 tap 這個集合。
return collect($photos) ->where("validated", true) ->tap(function ($validated) { return var_dump($validated->pluck("file_name")); }); });
上面的代碼將會輸出以下結(jié)果:
wallpaper spring mac fruittap VS Pipe(管道)
在Laravel中,也有類似的方法叫管道。 它們在某種意義上是相似的,因為它們都在集合管道中使用。 tap 和 pipe 之間有一個區(qū)別。 tap 允許你使用數(shù)據(jù),但不會修改原始返回值。 另一方面,pipe 根據(jù)返回值修改數(shù)據(jù)。
例如:
return collect($photos) ->where("validated", true) ->pipe(function ($validated) { return $validated->where("extension", "jpg")->pluck("file_name"); }); });
輸出結(jié)果為
wallpaper fruit
另一方面,如果我們像這樣使用上面的代碼:
return collect($photos) ->where("validated", true) ->tap(function ($validated) { return $validated->where("extension", "jpg")->pluck("file_name"); }); });
它將返回驗證設(shè)置為true的所有照片數(shù)組。
結(jié)果為
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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31985.html
摘要:接下來我將帶大家認(rèn)識下五個指令,這些指令將讓你在解決特定問題時如虎添翼。如果你是剛接觸的用戶,這些小技巧能帶你認(rèn)識到模板引擎的便捷與高效。 showImg(https://segmentfault.com/img/remote/1460000015076241); 接下來我將帶大家認(rèn)識下五個 Laravel Blade 指令,這些指令將讓你在解決特定問題時如虎添翼。如果你是剛接觸 La...
摘要:正確做法是給加索引,還有聯(lián)合索引,并不能避免全表掃描。 前言:有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報三連 有心的同學(xué)應(yīng)該會看到我這個noteBook下面的其它知識,希望對你們有些許幫助。 本文地址 時間點:2017-11 一個16年畢業(yè)生所經(jīng)歷的php面試 一、什么是面試 二、面試準(zhǔn)備 1. 問:什么時候開始準(zhǔn)備? 2. 問:怎么準(zhǔn)備? 三、面試...
摘要:原文發(fā)表在我的個人網(wǎng)站系列入門教程二最適合中國人的教程本教程示例代碼見大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。 原文發(fā)表在我的個人網(wǎng)站:Laravel 5 系列入門教程(二)【最適合中國人的 Laravel 教程】 本教程示例代碼見:https://github.com/johnlui/Learn-Laravel-5 大家在任何地方卡住,最快捷...
摘要:將返回通過回調(diào)真值測試的第一個項的鍵。方法將集合分割為多個給定大小的較小集合。它可用于在任何位置的調(diào)試和查找集合內(nèi)的內(nèi)容。方法用于遍歷整個集合。這對集合同樣有效。它將導(dǎo)致由第二個參數(shù)的值作為鍵的集合。它接受回調(diào)并傳遞并將集合傳遞給它。 showImg(https://segmentfault.com/img/remote/1460000018924972); 文章轉(zhuǎn)自:https://...
閱讀 3201·2021-11-24 09:39
閱讀 2869·2021-09-09 11:34
閱讀 3167·2021-09-07 09:58
閱讀 2273·2019-08-30 13:07
閱讀 2825·2019-08-29 15:09
閱讀 1540·2019-08-29 13:01
閱讀 2282·2019-08-26 12:18
閱讀 1864·2019-08-26 10:28