Как создать свои helper-функции в Laravel: пошаговый гайд

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Вступление: Почему 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) }}. Выглядит профессионально и чисто.

Лучшие практики: как не превратить хелперы в свалку

Вот несколько золотых правил,

Блоги

Рекомендаций по книгам