• Час читання ~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';

Визначення функцій

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

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

Це може бути складно, оскільки ви можете зіткнутися з ситуаціями, коли ви використовуєте визначення функції, якого ви не очікували, виходячи з того, яке з них було визначено першим.

Я надаю перевагу перевіркам function_exists у моїх допоміжних програмах, але якщо ви визначаєте помічників у контексті вашого додатку, ви можете відмовитися від перевіркиfunction_exists.

Пропустивши перевірку, ви побачите колізії щоразу, коли ваші помічники перевизначають функції, що може бути корисним.

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

Приклад

помічника Мені подобаються помічники шляху Rails та 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:

$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