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, щоб дізнатися більше про включення файлів і загальну інформацію про класи автозавантаження.