簡體   English   中英

什么是 Laravel 中的宏 Macroable

[英]What is a macro in laravel Macroable

請任何人都可以幫助我了解 Laravel Macroable trait 中的宏是什么,閱讀此文檔https://laravel.com/api/5.4/Illuminate/Support/Traits/Macroable.html只告訴我如何使用但我為什么要使用它,它是什么意思。

它用於在運行時動態地向類添加功能。

use Illuminate\Support\Collection;

Collection::macro('someMethod', function ($arg1 = 1, $arg2 = 1) {
    return $this->count() + $arg1 + $arg2;
});

$coll = new Collection([1, 2, 3]);
echo $coll->someMethod(1, 2);
// 6      = 3 + (1 + 2)
echo $coll->someMethod();
// 5      = 3 + (1 + 1)

我們已經“宏化”了一些名為someMethod的 Collection 類的功能。 我們現在可以在 Collection 類上調用這個方法並使用它的功能。

我們只是在類中添加了一個以前不存在的方法,而無需接觸任何源文件。

有關正在發生的事情的更多詳細信息,請查看我關於 Laravel 中宏的文章:

asklagbox - 博客 - Laravel 宏

它允許您添加新功能。 ::macro一次調用添加了一項新功能。 這可以在Macroable的內部框架類上Macroable

將函數添加到類的這個動作是在運行時完成的。 請注意,此操作已經/已經存在一個非常好的名稱,它不是“宏”這個詞,我將在本文末尾解釋。

問:你為什么要這樣做?

A. 如果您發現自己在處理這些內部類,例如請求和響應,它們添加函數可能會使您的代碼更具可讀性。 但與往常一樣,任何抽象都存在復雜性成本,因此只有在您感到痛苦時才這樣做。

本文包含您可以使用靜態調用"::macro"添加函數的類列表

盡量不要吞下宏這個詞,如果你讀了那篇文章——如果你像我一樣,它會給你帶來很大的消化不良。

所以,現在讓我們向內部框架類添加一個額外的函數 這是我剛剛實施的示例:

RedirectResponse::macro('withoutQuery', function() {
    return redirect()->to(explode('?', url()->previous())[0]);
});

這使我能夠在控制器中執行此操作:

redirect()->back()->withoutQuery(); 

(您可以只執行 back() 但我添加了 redirect() 以使其清楚)。

這個例子是重定向回來,之前的路線是這樣的:

http://myapp.com/home?something=something-else

此函數刪除“?”之后的部分,以簡單地重定向到:

http://myapp.com/home

我不必以這種方式對其進行編碼。 事實上,實現這一點的另一種方法是將以下函數放在所有控制器繼承自的基類中( App\\Http\\Controllers\\Controller )。

public function redirectBackWithoutQuery()
{
    return redirect()->to(explode('?',url()->previous())[0]);
}

這意味着我可以在任何控制器中執行此操作:

return $this->redirectBackWithoutQuery(); 

所以在這種情況下,“宏”讓你假裝你的新函數是內部框架類的一部分,在這種情況下是 Illuminate/RedirectResponse 類。

我個人喜歡你發現很難掌握“laravel 宏”。 我認為因為這個名字,它們很神秘。

第一點是您可能並不經常需要它們。 第二點是名稱 ::macro 的選擇,意思是“向類添加函數”

什么是真正的宏?

真正的宏是 Lisp 獨有的概念。 宏就像一個函數,但它構建並返回實際代碼,然后執行。 可以用其他語言編寫一個函數,該函數返回一個字符串,然后您將其作為代碼執行,這幾乎是相同的。 然而,如果你考慮一下,當你這樣做時,你就有了所有的語法來處理。 Lisp 代碼實際上是以列表的形式構建的。 如果 javascript 全部編寫為實際的 json,則可能會進行比較。 然后你可以編寫 javascript,它是 json,它返回 json,然后宏將執行它。 但是 lisp 在語法方面比 json 簡單得多,因此它比您想象的要容易得多。 因此,真正的 lisp 宏是您能遇到的最美麗、最神奇的事物之一。

那么為什么在 laravel 中這些添加功能的東西被稱為宏呢? 恐怕我不知道,你必須問作者,但我問自己他們真正做什么,並且已經有一個名字。

猴子補丁

TL; DR laravel 的 ::macro 可以更准確地描述為猴子補丁

所以如果使用 laravel ::macro 調用,我個人決定創建一個MonkeyPatchServiceProvider並將它們全部放在那里,以減少我自己不必要的混亂。

我意識到這個名字可能聽起來有點貶義,但這根本不是故意的。 原因很簡單,因為它已經有了一個名稱,而且我們有很多術語來處理為什么不使用現有名稱。

我認為閱讀此內容對您會更好。 它很美。 如果您閱讀此內容,希望您的概念會清晰。 您還將學習如何在 laravel 中使用可宏化的類。

Laravel 宏 | 學習如何擴展 Laravel 核心類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM