• Время чтения ~4 мин
  • 01.04.2024

Laravel предоставляет множество отличных вспомогательных функций , которые удобны для таких вещей, как работа с массивами, путями к файлам, строками и маршрутами, среди прочего, таких как любимая dd() функция.

Вы также можете определить свой собственный набор вспомогательных функций для ваших приложений Laravel и PHP-пакетов, используя Composer для их автоматического импорта.

Если вы новичок в Laravel или PHP, давайте рассмотрим, как вы можете создать свои собственные вспомогательные функции, которые автоматически загружаются Laravel.

Создание файла Helpers в приложении

Laravel Первый сценарий, в который вы, возможно, захотите включить вспомогательные функции, находится в контексте приложения Laravel. В зависимости от ваших предпочтений, вы можете организовать расположение вспомогательных файлов по своему усмотрению, однако вот несколько предлагаемых расположений:

  • app/helpers.php
  • app/Http/helpers.php

Я предпочитаю хранить свой app/helpers.php в корне пространства имен приложения.

Автозагрузка

Чтобы использовать вспомогательные функции PHP, вам необходимо загрузить их в вашу программу во время выполнения. В начале моей карьеры не было ничего необычного в том, чтобы увидеть такой код в верхней части файла:

require_once ROOT . '/helpers.php';

функции PHP не могут быть автоматически загружены. Тем не менее, у нас есть гораздо лучшее решение через Composer, чем использование require или require_once.

Если вы создадите новый проект Laravel, вы увидите autoload ключи и autoload-dev в файле composer.json :

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},
"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/"
    }
},

Если вы хотите добавить вспомогательный файл, у composer есть files ключ (который представляет собой массив путей к файлам), который вы можете определить внутри autoload:

"autoload": {
    "files": [
        "app/helpers.php"
    ],
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

После того, как вы добавите новый путь в массив, files вам нужно выгрузить автозагрузчик:

composer dump-autoload

Теперь при каждом запросе helpers.php файл будет загружаться автоматически, потому что Laravel требует автозагрузчика Composer в public/index.php:

require __DIR__.'/../vendor/autoload.php';

Определение функций

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

if (! function_exists('env')) {
    function env($key, $default = null) {
        // ...
    }
}

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

Я предпочитаю использовать function_exists проверки во вспомогательных функциях приложения, но если вы определяете вспомогательные функции в контексте вашего приложения, вы можете отказаться от function_exists проверки.

Пропустив проверку, вы будете видеть коллизии каждый раз, когда ваши помощники переопределяют функции, что может быть полезно.

На практике коллизии, как правило, случаются не так часто, как вы думаете, и вы должны убедиться, что вы определяете имена функций, которые не являются слишком общими. Вы также можете добавлять префиксы к именам функций, чтобы снизить вероятность их столкновения с другими зависимостями.

Пример помощника Мне

нравятся вспомогательные функции Rails path и URL, которые вы получаете бесплатно при определении ресурсоемкого маршрута. Например, маршрут ресурса photos будет предоставлять вспомогательные функции маршрута, такие как new_photo_path, edit_photo_path' и т. д.

Когда я использую маршрутизацию ресурсов в Laravel, мне нравится добавлять несколько вспомогательных функций, которые упрощают определение маршрутов в моих шаблонах. В моей реализации мне нравится иметь вспомогательную функцию URL, которую я могу передать модели Eloquent и получить обратно маршрут ресурса, используя соглашения, которые я определяю, например:

create_route($model);
edit_route($model);
show_route($model);
destroy_route($model);

Вот как вы можете определить a show_route в своем app/helpers.php файле (другие будут выглядеть аналогично):

if (! function_exists('show_route')) {
    function show_route($model, $resource = null)
    {
        $resource = $resource ?? plural_from_model($model);

        return route("{$resource}.show", $model);
    }
}
if (! function_exists('plural_from_model')) {
    function plural_from_model($model)
    {
        $plural = Str::plural(class_basename($model));

        return Str::kebab($plural);
    }
}

Функция plural_from_model() — это просто некоторый многократно используемый код, который вспомогательные функции маршрута используют для прогнозирования имени ресурса маршрута на основе соглашения об именовании, которое я предпочитаю, который является кебаб-падежом множественного числа модели.

Например, вот пример имени ресурса, полученного из модели:

$model = new App\LineItem;
plural_from_model($model);
// => line-items
plural_from_model(new App\User);
// => users

Используя это соглашение, вы должны определить маршрут ресурса, как в routes/web.php:

Route::resource('line-items', 'LineItemsController');
Route::resource('users', 'UsersController');

А затем в шаблонах колонок вы можете сделать следующее:

<a href="{{ show_route($lineItem) }}">
    {{ $lineItem->name }}
</a>

Что приведет к чему-то вроде следующего HTML-кода:

<a href="http://localhost/line-items/1">
    Line Item #1
</a>

Пакеты

Пакеты Composer также могут использовать вспомогательный файл для любых вспомогательных функций, которые вы хотите сделать доступными для проектов, использующих ваш пакет.

Вы будете использовать тот же подход в файле пакета composer.json , определяя files ключ с массивом вспомогательных файлов.

Крайне важно, чтобы вы добавили function_exists() проверки вокруг вспомогательных функций, чтобы проекты, использующие ваш код, не прерывались из-за конфликтов

имен.Вы должны выбрать правильные имена функций, которые уникальны для вашего пакета, и рассмотреть возможность использования короткого префикса, если вы опасаетесь, что имя вашей функции будет слишком общим.

Подробнее Ознакомьтесь

с документацией по автозагрузке Composer, чтобы узнать больше о включении файлов, а также общую информацию об автозагрузке классов.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297