Что такое макрос в Laravel Macroable

пожалуйста, может ли кто-нибудь помочь мне понять, что такое макрос в Laravel Macroable trait, чтение этой документации https://laravel.com/api/5.4/Illuminate/Support/Traits/Macroable.html только говорит мне, как использовать, но почему я использую его, для чего он предназначен.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
0
2 438
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Он предназначен для динамического добавления функциональности к классу во время выполнения.

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)

Мы «добавили макрос» к классу Collection под именем someMethod. Теперь мы можем вызвать этот метод в классе Collection и использовать его функции.

Мы просто добавили к классу метод, которого раньше не было, без необходимости касаться каких-либо исходных файлов.

Более подробно о том, что происходит, читайте в моей статье о макросах в Laravel:

asklagbox - блог - макросы Laravel

ух ты! спасибо, это действительно полезно, я создаю библиотеку, похожую на Laravel's Arr, тогда я нашел там этот макрос.

samezedi 13.07.2018 03:40

np, функциональность макросов очень полезна, и я знаю, что в конечном итоге часто их использую

lagbox 13.07.2018 04:05

Это позволяет добавлять новые функции. Один вызов ::macro добавляет одну новую функцию. Это можно сделать на тех из классов внутренней структуры, которые являются Macroable.

Это действие по добавлению функции в класс выполняется во время выполнения. Обратите внимание, что для этого действия уже существует / существует совершенно подходящее имя, а не слово «макрос», которое я объясню в конце этого поста.

Q. Why would you do this?

A. If you find yourself juggling with these internal classes, like request & response, adding a function to them might make your code more readable. But as always there is a complexity cost in any abstraction, so only do it if you feel pain.

эта статья содержит список классов, в которые вы можете добавлять функции, используя статический вызов "::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". Я подумал, что из-за названия они были чем-то загадочным.

Во-первых, они могут не понадобиться вам часто. Второй момент - это выбор name :: macro в значении «добавить функцию в класс».

Что такое настоящий макрос?

Настоящий макрос - это концепция, уникальная для Lisp. Макрос похож на функцию, но он строит и возвращает фактический код, который затем выполняется. Можно написать функцию на других языках, которая возвращает строку, которую вы затем выполняете, как если бы это был код, и это было бы почти то же самое. Однако, если вы думаете об этом, у вас есть весь синтаксис, с которым нужно иметь дело, когда вы это делаете. Код Lisp на самом деле структурирован в виде списков. Сравнение можно было бы представить, если бы javascript был написан как настоящий json. Затем вы могли бы написать javascript, который был json, который возвращал json, который макрос затем просто выполнял. Но Lisp намного проще, чем json с точки зрения синтаксиса, поэтому он намного проще, чем вы только что представляли. Итак, настоящий шепелявый макрос - одна из самых красивых и удивительных вещей, с которыми вы можете столкнуться.

Так почему же эти дополнительная функция вещи в laravel называются макросами? Мне это неизвестно, боюсь, вам придется спросить автора, но я спросил себя, чем они на самом деле занимаются, и есть ли уже название для этого.

Нашивки с обезьянами

TL;DR laravel's ::macro could more accurately be described as monkey patch

Поэтому, если я использую вызовы макросов laravel ::, я лично решил создать MonkeyPatchServiceProvider и поместить их все туда, чтобы уменьшить ненужную путаницу для себя.

Я понимаю, что название может звучать немного унизительно, но это совсем не так. Это просто потому, что для этого уже есть название, и у нас так много терминологии, чтобы разобраться, почему бы не использовать существующее имя.

Думаю, вам будет лучше, если вы прочтете этот контент. Это красиво. Надеюсь, ваша концепция станет понятной, если вы прочтете этот контент. Вы также узнаете, как использовать макроклассы в laravel.

Макросы Laravel | Узнайте, как расширить базовый класс Laravel

Другие вопросы по теме