亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Laravel 中強(qiáng)大的tap你用過(guò)么

junfeng777 / 1630人閱讀

摘要:在調(diào)用回調(diào)函數(shù)后,它將返回參數(shù)。例如在上面的例子中,我們傳遞一個(gè)參數(shù)照片模型和一個(gè)回調(diào)函數(shù),該函數(shù)簡(jiǎn)單地將設(shè)置為并保存模型。如果沒(méi)有給出回調(diào)函數(shù),因?yàn)樗强蛇x的,將返回的新實(shí)例。允許你使用數(shù)據(jù),但不會(huì)修改原始返回值。

在本文,我們將討論 Laravel 中的 tap。我們將詳細(xì)討論 tap 幫助函數(shù)和 collection 中的 tap 方法。

Tap 幫助函數(shù) 舊的實(shí)現(xiàn)方式

Laravel提出了一個(gè) tap 功能。這是一個(gè)非常奇怪的功能,受Ruby的啟發(fā)。這是 tap 助手功能的基本實(shí)現(xiàn)。

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

    return $value;
}

上面的代碼將接受一個(gè)參數(shù),它將使用該參數(shù)調(diào)用一個(gè)匿名函數(shù)。在調(diào)用回調(diào)函數(shù)后,它將返回參數(shù)。
讓我們看看我們?nèi)绾我杂幸饬x的方式使用它。例如:

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

在上面的例子中,我們傳遞一個(gè)參數(shù)(照片模型)和一個(gè)回調(diào)函數(shù),該函數(shù)簡(jiǎn)單地將 validated 設(shè)置為 true 并保存模型。這個(gè)函數(shù)然后將照片模型實(shí)例返回給調(diào)用者。

新的實(shí)現(xiàn)方式

在最新版本的Laravel 5.4和Laravel 5.5中,更高級(jí)的 tap 來(lái)了。它引入了更短的使用方式。這里是 tap 函數(shù)的新實(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ù)中的多個(gè)方法,這里其實(shí)也就是照片Model中支持的方法。例如

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

我們能夠?qū)⑷魏文P偷姆椒ㄍㄟ^(guò) tap 鏈?zhǔn)秸{(diào)用。此更新方法通常返回 truefalse,但是這里使用了 tap 函數(shù)。在這種情況下,它將返回照片模型。tap 可以幫助你返回作為參數(shù)傳遞的對(duì)象。

它是如何工作的

tap 是一個(gè)非常有用的功能,但有時(shí)它很難理解它是如何工作的。 這里來(lái)解釋它是如何工作的。

如果沒(méi)有給出回調(diào)函數(shù),因?yàn)樗强蛇x的,Laravel將返回 HigherOrderTapProxy 的新實(shí)例。 在 HigherOrderTapProxy 類(lèi)中定義了調(diào)用魔術(shù)方法。 調(diào)用魔術(shù)方法是由語(yǔ)言動(dòng)態(tài)調(diào)用的(所謂的方法在類(lèi)中沒(méi)有定義)。 因?yàn)槌苏{(diào)用魔術(shù)方法,HigherOrderTapProxy 類(lèi)中沒(méi)有定義方法,所以每次使用 tap 函數(shù)任何方法調(diào)用時(shí)都會(huì)調(diào)用它。 在調(diào)用魔術(shù)方法中,我們的更新方法或任何我們調(diào)用的方法將被參數(shù)調(diào)用,并且它將返回我們最初傳遞給 tap 函數(shù)的參數(shù)。

這里是 HigherOrderTapProxy 類(lèi)中調(diào)用魔術(shù)方法的實(shí)際內(nèi)容。

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

    return $this->target;
}

在上面的代碼中,target 屬性是我們?cè)趖ap中傳遞的參數(shù)。

Laravel collection 中的 tap 方法

Laravel還在 collection 類(lèi)中有一個(gè) tap 方法,可讓你在特定的地方傳入?yún)?shù)到 tap中,并對(duì)這些結(jié)果進(jìn)行處理。tap 不會(huì)影響主要 collection 的結(jié)果。 這對(duì)調(diào)試代碼和查找在處理集合時(shí)出現(xiàn)錯(cuò)誤的地方很有幫助。
我們用一個(gè)例子來(lái)解釋這個(gè)方法。 初始化以下數(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)在讓我們嘗試在這個(gè)數(shù)組上使用 tap 方法。首先,我們必須將這個(gè)數(shù)組轉(zhuǎn)換為一個(gè)集合,然后在特定點(diǎn)處 tap 這個(gè)集合。

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

上面的代碼將會(huì)輸出以下結(jié)果:

wallpaper
spring
mac
fruit
tap VS Pipe(管道)

在Laravel中,也有類(lèi)似的方法叫管道。 它們?cè)谀撤N意義上是相似的,因?yàn)樗鼈兌荚诩瞎艿乐惺褂谩?tappipe 之間有一個(gè)區(qū)別。 tap 允許你使用數(shù)據(jù),但不會(huì)修改原始返回值。 另一方面,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");
    });
});

它將返回驗(yàn)證設(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知識(shí),請(qǐng)前往PHPCasts

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31985.html

相關(guān)文章

  • 5 個(gè)非常有用 Laravel Blade 指令,用過(guò)哪些?

    摘要:接下來(lái)我將帶大家認(rèn)識(shí)下五個(gè)指令,這些指令將讓你在解決特定問(wèn)題時(shí)如虎添翼。如果你是剛接觸的用戶,這些小技巧能帶你認(rèn)識(shí)到模板引擎的便捷與高效。 showImg(https://segmentfault.com/img/remote/1460000015076241); 接下來(lái)我將帶大家認(rèn)識(shí)下五個(gè) Laravel Blade 指令,這些指令將讓你在解決特定問(wèn)題時(shí)如虎添翼。如果你是剛接觸 La...

    stefan 評(píng)論0 收藏0
  • 一個(gè) 16年畢業(yè)生所經(jīng)歷 PHP 面試

    摘要:正確做法是給加索引,還有聯(lián)合索引,并不能避免全表掃描。 前言:有收獲的話請(qǐng)加顆小星星,沒(méi)有收獲的話可以 反對(duì) 沒(méi)有幫助 舉報(bào)三連 有心的同學(xué)應(yīng)該會(huì)看到我這個(gè)noteBook下面的其它知識(shí),希望對(duì)你們有些許幫助。 本文地址 時(shí)間點(diǎn):2017-11 一個(gè)16年畢業(yè)生所經(jīng)歷的php面試 一、什么是面試 二、面試準(zhǔn)備 1. 問(wèn):什么時(shí)候開(kāi)始準(zhǔn)備? 2. 問(wèn):怎么準(zhǔn)備? 三、面試...

    dabai 評(píng)論0 收藏0
  • Laravel 5 系列入門(mén)教程(二)【最適合國(guó)人 Laravel 教程】

    摘要:原文發(fā)表在我的個(gè)人網(wǎng)站系列入門(mén)教程二最適合中國(guó)人的教程本教程示例代碼見(jiàn)大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。 原文發(fā)表在我的個(gè)人網(wǎng)站:Laravel 5 系列入門(mén)教程(二)【最適合中國(guó)人的 Laravel 教程】 本教程示例代碼見(jiàn):https://github.com/johnlui/Learn-Laravel-5 大家在任何地方卡住,最快捷...

    未東興 評(píng)論0 收藏0
  • 十五個(gè)常用 Laravel 集合(Collection)

    摘要:將返回通過(guò)回調(diào)真值測(cè)試的第一個(gè)項(xiàng)的鍵。方法將集合分割為多個(gè)給定大小的較小集合。它可用于在任何位置的調(diào)試和查找集合內(nèi)的內(nèi)容。方法用于遍歷整個(gè)集合。這對(duì)集合同樣有效。它將導(dǎo)致由第二個(gè)參數(shù)的值作為鍵的集合。它接受回調(diào)并傳遞并將集合傳遞給它。 showImg(https://segmentfault.com/img/remote/1460000018924972); 文章轉(zhuǎn)自:https://...

    alphahans 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<