Функции в 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 можно писать свои функции где угодно. Вопрос не «как», а «что потом будет».
- Если нужен быстрый костыль — глобальный хелпер спасёт.
- Если нужна структура — сервис.
- Если хочешь повторно использовать код в нескольких местах — трейт.
Только помни: любой из этих способов можно довести до абсурда. Да так, что у тебя проект начинает пахнуть так, будто в нём умер енот.
0 комментариев