Функции в Laravel нужны, как и в любом проекте: где-то нужно отформатировать дату, где-то склеить строку, где-то по-быстрому вытащить данные. Но есть нюанс: если пихать всё подряд в глобальные хелперы, через год у тебя получится «php-файл бога», где собраны крохи всего кода.

Когда ты только начинаешь, кажется логичным: «А что, если я сделаю глобальную функцию format_date() и буду юзать её везде?» И звучит вроде норм, пока через полгода у тебя нет файла helpers.php на 500 строк, где перемешаны даты, JSON, работа с API и хер пойми что.

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

Вариант 1. Глобальные функции

Да, можно сделать app/Helpers/Helpers.php и туда пихать свои штуки:

if (! function_exists('format_date')) {
    function format_date(\DateTime $date)
    {
        return $date->format('d-m-Y');
    }
}

И добавить это в composer.json:

"autoload": {
    "files": [
        "app/Helpers/Helpers.php"
    ] } 

Потом composer dump-autoload, и всё, функция доступна в любом месте кода.

Проблема: через год в этом файле будет не «хелпер даты», а «свалка всего подряд». Угадаешь, что произойдёт дальше? Любая правка — мини-русская рулетка: выстрелит ли в проде или нет.

Вариант 2. Сервисы

Если функция реально относится к какому-то предметному смыслу — пихни её в сервис.

namespace App\Services;

class DateService
{
    public function formatDate(\DateTime $date)
    {
        return $date->format('d-m-Y');
    }
}

Используешь потом:

$dateService = new \App\Services\DateService();
echo $dateService->formatDate(new \DateTime());

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

Вариант 3. Трейты

Если нужно переиспользовать методы в разных классах — трейт.

namespace App\Traits;

trait DateFormatter
{
    public function formatDate(\DateTime $date)
    {
        return $date->format('d-m-Y');
    }
}

И потом:

class SomeClass
{
    use \App\Traits\DateFormatter;

    public function someMethod()
    {
        echo $this->formatDate(new \DateTime());
    }
}

Но с трейтом тоже аккуратно: если пихать в него всё подряд, получишь мини-Eloquent внутри трейта.

Где поджидают грабли

Глобальные функции хороши для реально мелочёвки (array_get, str_slug — такого уровня). Всё остальное там будет вонять.

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

Трейты — костыль. Удобный, но костыль. Использовать можно, но когда видишь в проекте трейт на 100 методов — знай, это уже адский «god class», просто замаскированный.

Финалочка

В Laravel можно писать свои функции где угодно. Вопрос не «как», а «что потом будет».

  • Если нужен быстрый костыль — глобальный хелпер спасёт.
  • Если нужна структура — сервис.
  • Если хочешь повторно использовать код в нескольких местах — трейт.

Только помни: любой из этих способов можно довести до абсурда. Да так, что у тебя проект начинает пахнуть так, будто в нём умер енот.