Вступление: Почему helper-функции — это маст-хэв в Laravel
Если вы когда-нибудь писали на Laravel, то наверняка сталкивались с ситуацией: в контроллере или шаблоне нужно снова и снова форматировать дату, обрезать текст, проверять права доступа или генерировать slug. Вы копируете один и тот же кусок кода из проекта в проект, а потом проклинаете себя за дублирование.
Знакомо? Добро пожаловать в клуб. На Stack Overflow вопрос "How to create custom helper functions in Laravel" собирает тысячи просмотров — и это не случайно. Helper-функции (или просто «хелперы») — это ваш способ сказать «нет» копипасте и «да» чистому, переиспользуемому коду.
В этом туториале мы не просто покажем, как создать свою первую helper-функцию. Мы разберем три проверенных способа — от самого простого до продвинутого с автозагрузкой через Composer. Вы узнаете, как организовать хелперы так, чтобы они не превратились в свалку, и как тестировать их без головной боли.
Поехали!
Что такое helper-функция и зачем она нужна?
Helper-функция — это обычная PHP-функция, которая выполняет одну конкретную задачу. В Laravel уже есть встроенные хелперы: str_slug(), route(), config() и другие. Но рано или поздно вам понадобится что-то своё — например, функция для форматирования номера телефона или генерации уникального идентификатора.
Преимущества кастомных хелперов:
- Переиспользование кода — написали один раз, используете везде.
- Читаемость — вместо 10 строк с условиями пишете
formatPhone($number). - Тестируемость — хелперы легко покрыть юнит-тестами.
- Централизованное управление — изменили логику в одном месте, и она применилась во всём проекте.
Но есть и подводный камень: неправильная организация хелперов может превратить ваш проект в хаос. Поэтому давайте сразу делать правильно.
Способ 1: Классический — файл helpers.php вручную
Самый простой и понятный способ для новичков. Создаём файл app/helpers.php и подключаем его в composer.json.
Шаг 1. Создаём файл helpers.php
Перейдите в корень вашего Laravel-проекта и создайте файл app/helpers.php. Внутри пишем простую функцию:
<?php
if (!function_exists('formatDate')) {
function formatDate($date, $format = 'd.m.Y')
{
if (!$date) {
return null;
}
return Carbon\Carbon::parse($date)->format($format);
}
}
Обратите внимание на обёртку if (!function_exists(...)). Это страховка от конфликтов, если вдруг функция уже определена в другом месте. Всегда используйте эту конструкцию.
Шаг 2. Подключаем файл через Composer
Откройте composer.json и в секции autoload добавьте:
"files": [
"app/helpers.php"
]
Должно получиться примерно так:
"autoload": {
"psr-4": {
"App\\": "app/"
},
"files": [
"app/helpers.php"
]
}
Теперь выполните команду в терминале:
composer dump-autoload
Всё! Теперь вы можете использовать formatDate() в любом месте вашего Laravel-приложения — в контроллерах, моделях, Blade-шаблонах.
Способ 2: Через Service Provider (более продвинутый)
Этот метод подходит, если вы хотите строго контролировать, когда и какие хелперы загружаются. Например, если у вас есть хелперы только для админки или для API.
Шаг 1. Создаём Service Provider
Выполните artisan-команду:
php artisan make:provider HelperServiceProvider
Откройте созданный файл app/Providers/HelperServiceProvider.php и в методе register() подключите ваш файл с хелперами:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider
{
public function register(): void
{
require_once app_path('helpers.php');
}
public function boot(): void
{
//
}
}
Шаг 2. Регистрируем провайдер
Откройте config/app.php и добавьте в массив providers:
App\Providers\HelperServiceProvider::class,
Готово. Теперь ваши хелперы загружаются только при старте Laravel, а не на этапе composer-автозагрузки. Это даёт больше гибкости, особенно если вы используете dependency injection внутри хелперов.
Способ 3: Организация в классах (для сложной логики)
Когда хелперов становится много (больше 10-15), лучше не сваливать всё в один файл, а группировать по классам. Например, StringHelper, NumberHelper, DateHelper.
Шаг 1. Создаём директорию Helpers
Создайте папку app/Helpers/. Внутри — файл StringHelper.php:
<?php
namespace App\Helpers;
class StringHelper
{
public static function truncate($text, $length = 100, $suffix = '...')
{
if (mb_strlen($text) <= $length) {
return $text;
}
return mb_substr($text, 0, $length) . $suffix;
}
public static function stripTags($text, $allowedTags = '')
{
return strip_tags($text, $allowedTags);
}
}
Шаг 2. Создаём фасад (опционально)
Чтобы вызывать методы как StringHelper::truncate() без лишнего импорта, можно создать фасад:
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class StringHelper extends Facade
{
protected static function getFacadeAccessor()
{
return 'string.helper';
}
}
Затем зарегистрируйте binding в AppServiceProvider:
$this->app->bind('string.helper', function () {
return new \App\Helpers\StringHelper();
});
Теперь вы можете использовать хелпер в Blade как {{ StringHelper::truncate($post->text, 50) }}. Выглядит профессионально и чисто.
Лучшие практики: как не превратить хелперы в свалку
Вот несколько золотых правил,