摘要:在調用回調函數后,它將返回參數。例如在上面的例子中,我們傳遞一個參數照片模型和一個回調函數,該函數簡單地將設置為并保存模型。如果沒有給出回調函數,因為它是可選的,將返回的新實例。允許你使用數據,但不會修改原始返回值。
在本文,我們將討論 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 鏈式調用。此更新方法通常返回 true 或 false,但是這里使用了 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 fruittap VS Pipe(管道)
在Laravel中,也有類似的方法叫管道。 它們在某種意義上是相似的,因為它們都在集合管道中使用。 tap 和 pipe 之間有一個區別。 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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31985.html
摘要:接下來我將帶大家認識下五個指令,這些指令將讓你在解決特定問題時如虎添翼。如果你是剛接觸的用戶,這些小技巧能帶你認識到模板引擎的便捷與高效。 showImg(https://segmentfault.com/img/remote/1460000015076241); 接下來我將帶大家認識下五個 Laravel Blade 指令,這些指令將讓你在解決特定問題時如虎添翼。如果你是剛接觸 La...
摘要:正確做法是給加索引,還有聯合索引,并不能避免全表掃描。 前言:有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報三連 有心的同學應該會看到我這個noteBook下面的其它知識,希望對你們有些許幫助。 本文地址 時間點:2017-11 一個16年畢業生所經歷的php面試 一、什么是面試 二、面試準備 1. 問:什么時候開始準備? 2. 問:怎么準備? 三、面試...
摘要:原文發表在我的個人網站系列入門教程二最適合中國人的教程本教程示例代碼見大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。 原文發表在我的個人網站:Laravel 5 系列入門教程(二)【最適合中國人的 Laravel 教程】 本教程示例代碼見:https://github.com/johnlui/Learn-Laravel-5 大家在任何地方卡住,最快捷...
摘要:將返回通過回調真值測試的第一個項的鍵。方法將集合分割為多個給定大小的較小集合。它可用于在任何位置的調試和查找集合內的內容。方法用于遍歷整個集合。這對集合同樣有效。它將導致由第二個參數的值作為鍵的集合。它接受回調并傳遞并將集合傳遞給它。 showImg(https://segmentfault.com/img/remote/1460000018924972); 文章轉自:https://...
閱讀 3235·2021-11-24 09:39
閱讀 2912·2021-09-09 11:34
閱讀 3188·2021-09-07 09:58
閱讀 2298·2019-08-30 13:07
閱讀 2858·2019-08-29 15:09
閱讀 1559·2019-08-29 13:01
閱讀 2299·2019-08-26 12:18
閱讀 1910·2019-08-26 10:28