О разделе

Laravel поставляется с десятками helper-функций и статических методов, которые экономят сотни строк кода. Они покрывают: работу с запросами, валидацию, Eloquent-запросы, коллекции, строки, массивы, даты, сессии, авторизацию, маршруты, отладку.

Что такое helper? Глобальная функция (request(), now(), collect()) или статический метод фасада (Str::slug(), Arr::get()), доступные где угодно — в контроллерах, моделях, Blade, командах.

Этот раздел структурирован так, чтобы каждый helper было видно с тремя пунктами: что делает, пример кода, use case (когда применять).

Категории
КатегорияЧто покрываетПримеры
RequestЧтение входных данныхrequest(), input(), filled(), old()
ValidationПроверка входных данныхrequired, email, unique, Rule::in(), sometimes
EloquentЗапросы к БДwhere(), find(), with(), whereHas(), paginate()
CollectionsРабота с массивами на стероидахmap(), filter(), reduce(), groupBy()
StrСтрокиStr::slug(), limit(), contains(), random()
ArrМассивыArr::get(), only(), except(), set()
CarbonДаты и времяnow(), addDays(), diffForHumans()
Auth/SessionСессии и пользовательauth(), session(), bcrypt()
RoutingURL и редиректыroute(), url(), redirect(), asset()
DebugОтладкаdd(), dump(), abort(), config()
ArtisanCLI командыmigrate, make:model, tinker
Лайфхак: 90% повседневной разработки — это комбинация этих хелперов. Запомни их визуально (внешний вид + один use case на каждый) — и ты решишь большинство задач без гугла.
Request Handling

Чтение данных из формы, query-параметров, JSON-тела. В Laravel нет прямой работы с $_GET/$_POST — всё через объект Request или global helper request().

Чтение данных

request() / $request->input()

Получить любое поле из запроса (form, JSON, query). Второй аргумент — значение по умолчанию.

public function store(Request $request)
{
    $name  = $request->input('name');          // из формы/JSON
    $email = request('email');                 // то же через helper
    $role  = $request->input('role', 'guest'); // default
}
Use case: Любой контроллер, читающий данные от пользователя.

$request->all() / only() / except()

Получить весь массив входных данных или его подмножество.

$data  = $request->all();                          // все поля
$creds = $request->only(['email', 'password']); // только нужные
$safe  = $request->except(['_token', 'password']); // без указанных
Use case: Model::create($request->only([...])) — безопасный mass-assign только нужных полей.
Проверка наличия

filled()

true, если поле есть и не пустое (не null, не '', не []).

if ($request->filled('phone')) {
    sendSMS($request->input('phone'));
}
Use case: Опциональные поля — выполнять логику только если пользователь реально что-то ввёл.

has()

true, если поле присутствует в запросе (даже если пустая строка).

if ($request->has('promo_code')) {
    applyDiscount($request->input('promo_code'));
}
Use case: Отличить «поле не передано» от «передано пустым» — например, очистка значения через ?promo_code=.
UX форм / модели

old()

Возвращает старое значение поля из flash-сессии — сохраняет ввод формы после ошибки валидации.

<!-- В Blade -->
<input type="email" name="email" value="{{ old('email') }}">
Use case: UX форм — после redirect-back пользователь видит свои данные, а не пустые поля.

$model->fill($request->all())

Заполняет атрибуты модели из массива (без сохранения). Соблюдает $fillable.

public function update(Request $request, User $user)
{
    $user->fill($request->validated());
    $user->save();
}
Use case: Обновление существующей модели — заполнил поля, сохранил. Альтернатива: $user->update($data) делает то же самое в одну строку.
Validation — базовые правила

90% задач валидации решаются комбинацией этих правил. Применяются через $request->validate([...]) или в FormRequest::rules().

Базовый шаблон:
$validated = $request->validate([
    'email'    => 'required|email|unique:users,email',
    'password' => 'required|confirmed|min:8',
]);
Обязательность

required

Поле должно присутствовать и не быть пустым.

'email' => 'required',
Use case: Обязательные поля — email, password, name.

nullable

Разрешает null или отсутствие поля. Часто комбинируется с типом.

'middle_name' => 'nullable|string|max:100',
Use case: Опциональные поля. Без nullable правило string отвергнет null.
Тип значения

email

Валидный email-формат. Опции: email:rfc,dns (проверка DNS).

'email' => 'required|email',
'email' => 'required|email:rfc,dns', // строже
Use case: Регистрация, контактные формы.

numeric / integer

numeric — любое число (вкл. дробные), integer — только целое.

'price'    => 'required|numeric|min:0',
'quantity' => 'required|integer|min:1',
Use case: Цены, счётчики, возраст.

regex:/pattern/

Кастомный шаблон через регулярное выражение.

'username' => ['required', 'regex:/^[a-zA-Z0-9_]+$/'],
'phone'    => ['required', 'regex:/^\+?[0-9]{10,15}$/'],
Use case: Когда стандартных правил мало — телефоны, кастомные форматы кодов.
Размер / длина

min / max

Для строк — длина, для чисел — значение, для файлов — размер в KB, для массивов — кол-во элементов.

'username' => 'required|min:3|max:20',    // 3–20 символов
'age'      => 'integer|min:18',           // число ≥ 18
'photo'    => 'file|max:2048',            // до 2 МБ
Use case: Ограничения длины ввода, диапазоны значений, размер загружаемых файлов.
Список / БД

unique:table,column

Значение уникально в указанной таблице/колонке. При обновлении исключи текущую запись.

// При создании
'email' => 'required|email|unique:users,email',

// При обновлении (исключить текущего юзера по id)
'email' => ['required', 'email', Rule::unique('users')->ignore($user->id)],
Use case: Email, username, slug, SKU — всё, что должно быть уникальным в БД.

exists:table,column

Проверяет, что значение существует в указанной таблице. Применяется к foreign key'ам.

'category_id' => 'required|exists:categories,id',
Use case: Защита от FK constraint violation — не дать вставить ID несуществующей записи.

Rule::in([...])

Значение должно быть в списке разрешённых. Аналог enum.

use Illuminate\Validation\Rule;

'status' => ['required', Rule::in(['draft', 'published', 'archived'])],
Use case: Dropdown'ы, роли, статусы, типы — любые предопределённые списки значений.

confirmed

Требует наличия поля {field}_confirmation с тем же значением.

'password' => 'required|confirmed|min:8',
// В форме нужны: password И password_confirmation
Use case: Подтверждение пароля при регистрации / смене пароля.
Validation — продвинутые правила

Дополнительный арсенал для дат, массивов, файлов и условной валидации.

Даты

date

Валидная дата (любой формат, который понимает PHP strtotime).

'birthday' => 'required|date',
'event'    => 'required|date_format:Y-m-d H:i', // строгий формат
Use case: Дни рождения, даты событий, дедлайны.

before / after

Сравнение дат. Может ссылаться на другое поле или константу типа today.

'start_date' => 'required|date',
'end_date'   => 'required|date|after:start_date',
'birthday'   => 'required|date|before:today',
Use case: Бронирования, периоды, расписания, дата рождения в прошлом.
Условные

sometimes

Правило применяется только если поле присутствует в запросе. Иначе — игнорируется.

'phone' => 'sometimes|numeric|digits_between:10,15',
Use case: PATCH-эндпоинты (частичное обновление) — поле либо не пришло, либо должно быть валидным.
Массивы

array + field.*

Поле — массив. Через tags.* валидируется каждый элемент.

'tags'   => 'required|array|min:1',
'tags.*' => 'string|max:30',
Use case: Чекбоксы, теги, мульти-селект, массив ID для bulk-операций.

distinct

Элементы массива должны быть уникальными.

'emails'   => 'array',
'emails.*' => 'email|distinct',
Use case: Массовая рассылка — запретить дубликаты адресов.
Форматы данных

json

Строка должна быть валидным JSON.

'metadata' => 'required|json',
Use case: Сохранение конфигов / метаданных в текстовое поле БД (если не используешь cast).

boolean

Принимает: true, false, 1, 0, "1", "0".

'is_active' => 'required|boolean',
Use case: Toggle-флаги: published/draft, active/inactive.

ip / url / active_url

Сетевые форматы. active_url проверяет, что домен реально резолвится.

'server_ip' => 'required|ip',
'website'   => 'required|url',
'callback'  => 'required|active_url',
Use case: Webhook URLs, callback'и, серверные конфиги.
Файлы

mimes / mimetypes

Тип загружаемого файла. mimes — по расширению, mimetypes — по MIME.

'avatar'   => 'required|image|mimes:jpg,png,webp|max:2048',
'document' => 'required|mimetypes:application/pdf|max:5120',
Use case: Безопасные загрузки — запретить .exe, .php, .sh.
Совет: Сложную валидацию выноси в FormRequest:
class StoreUserRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'name'     => 'required|string|max:100',
            'email'    => 'required|email|unique:users',
            'password' => 'required|confirmed|min:8',
        ];
    }
}
Eloquent — query helpers

Методы query builder'а, доступные на любой модели и её отношениях.

Фильтрация

where() / orWhere()

Базовые условия WHERE. orWhere добавляет OR-ветку.

User::where('status', 'active')->get();
User::where('age', '>', 18)
    ->orWhere('role', 'admin')
    ->get();
Use case: Фильтрация — основа любого запроса.

whereIn() / whereNotIn()

WHERE IN (...) — поиск по списку значений.

User::whereIn('id', [1, 2, 3])->get();
Post::whereNotIn('status', ['draft', 'deleted'])->get();
Use case: Bulk-выборки по массиву ID (например, после request()->input('ids')).
Поиск одной записи

find() / findOrFail()

Поиск по первичному ключу. findOrFail бросает 404.

$user = User::find(5);        // null если не найден
$user = User::findOrFail(5);  // 404 если не найден
Use case: Показ страницы по ID — findOrFail избавляет от ручной проверки if (!$user) abort(404).

first() / firstOrFail()

Первая запись по условию. firstOrFail бросает 404.

$user = User::where('email', $email)->first();
$user = User::where('email', $email)->firstOrFail();
Use case: Поиск по уникальному не-ID полю (email, slug).
Сортировка / лимит / пагинация

orderBy() / latest() / oldest()

Сортировка. latest() — алиас orderBy('created_at', 'desc').

Post::orderBy('created_at', 'desc')->get();
Post::latest()->take(10)->get();   // 10 свежих
Use case: Лента новостей, последние заказы.

take() / limit()

Ограничить число записей.

User::orderBy('id', 'desc')->take(5)->get();
Use case: Виджеты «топ-5», превью.

paginate()

Готовая пагинация: возвращает LengthAwarePaginator с навигацией.

$posts = Post::latest()->paginate(10);

// В Blade:
{{ $posts->links() }}
Use case: Любой список, который не помещается на одной странице. Без боли с offset/limit/page.
Извлечение колонок

pluck()

Извлечь одну колонку. Опционально — построить key=>value мапу.

$emails  = User::pluck('email');             // [email, email, ...]
$options = User::pluck('name', 'id');       // [id => name]
Use case: Опции для <select>, списки email'ов для рассылки.
Relations & eager loading

with() — eager loading

Подгружает связанные модели одним запросом — спасает от N+1 проблемы.

// Плохо (N+1):
foreach (User::all() as $u) {
    echo $u->posts->count(); // +1 запрос на каждого юзера
}

// Хорошо (2 запроса всего):
foreach (User::with('posts')->get() as $u) {
    echo $u->posts->count();
}
Use case: Любая выборка, где потом обращаешься к relations в цикле.

whereHas()

Фильтрация по связанной модели — «есть ли подходящие related».

// Пользователи, у которых есть хотя бы один опубликованный пост
User::whereHas('posts', function ($q) {
    $q->where('status', 'published');
})->get();
Use case: Авторы со статьями, клиенты с заказами, юзеры с подпиской.
Существование & счётчики

count() / exists() / doesntExist()

Количество или булевая проверка существования без загрузки моделей.

$total = User::where('active', true)->count();
if (User::where('email', $email)->exists()) { ... }
Use case: Счётчики на дашборде, проверка дубликатов без выгрузки данных.
Collections

Все Eloquent-результаты (get(), all()) возвращают Collection. Любой массив можно обернуть через collect(). Методы chain'аются и не мутируют исходное.

Создание

collect()

Обёртка над массивом — открывает все методы коллекции.

$nums = collect([1, 2, 3, 4, 5]);
$nums->filter(fn($n) => $n % 2 === 0)->values(); // [2, 4]
Use case: Любая обработка массива — не пиши foreach, используй коллекции.
Трансформация

map()

Трансформирует каждый элемент. Возвращает новую коллекцию.

$prices = collect([100, 200, 300]);
$withTax = $prices->map(fn($p) => $p * 1.12);
// [112, 224, 336]
Use case: Применить операцию ко всем элементам — добавить налог, форматировать даты, сериализовать.

reduce()

Свёртка коллекции в одно значение (аккумулятор).

$total = collect([100, 250, 50])
    ->reduce(fn($carry, $x) => $carry + $x, 0);
// 400
Use case: Сложные агрегации, где sum() не справляется.
Агрегаты

sum() / avg() / max() / min()

Базовые агрегаты. Можно передать ключ объекта.

$invoices->sum('amount');   // сумма всех amount
$grades->avg();              // среднее
$products->max('price');    // макс
Use case: Дашборды, отчёты, статистика.
Группировка / сортировка / извлечение

groupBy()

Группирует элементы по ключу или результату функции.

$users->groupBy('role');
// ['admin' => [...], 'editor' => [...]]

$orders->groupBy(fn($o) => $o->created_at->format('Y-m'));
Use case: Отчёты — продажи по месяцам, юзеры по ролям, заказы по статусам.

pluck()

То же, что в Eloquent — извлечь одно поле из всех элементов.

$names = $users->pluck('name');
$map   = $users->pluck('email', 'id');
Use case: Подготовка данных для select, exports.

sortBy() / sortByDesc()

Сортировка коллекции (без модификации БД-запроса).

$products->sortBy('price');
$products->sortByDesc('created_at');
Use case: Сортировка уже выгруженных данных или массивов из API.
Фильтрация / поиск

filter()

Оставляет только элементы, удовлетворяющие условию.

$active = $users->filter(fn($u) => $u->is_active);
Use case: Удалить inactive/deleted/нерелевантные элементы из выборки.

contains()

Проверяет наличие значения в коллекции.

$emails->contains('a@gmail.com');             // true/false
$users->contains('role', 'admin');             // есть ли админ
Use case: Проверки на наличие, авторизация по ролям.

where() / whereIn() на коллекции

Фильтрация коллекции по ключу/значению (не путать с Eloquent-запросом).

$over30 = $users->where('age', '>', 30);
$admins = $users->whereIn('role', ['admin', 'owner']);
Use case: Дополнительная фильтрация уже выбранной из БД коллекции.
Итерация / bulk

chunk() / each()

Разбивка на куски / итерация.

$users->chunk(100)->each(function ($chunk) {
    processBatch($chunk);
});
Use case: Bulk-обработка больших выборок без OOM (рассылки, импорты).
Strings — Str хелперы

Фасад Illuminate\Support\Str — все строковые операции. Часть из них дублирует встроенные PHP-функции, но единообразнее и с поддержкой Unicode.

URL & SEO-формат

Str::slug()

URL-friendly slug из строки.

Str::slug('Laravel Framework Basics!');
// "laravel-framework-basics"

Str::slug('Привет мир', '-', 'ru');
// "privet-mir"
Use case: URL для блог-постов, продуктов, категорий — SEO-friendly.

Str::limit()

Обрезает строку, добавляет «…» (или кастомный суффикс).

Str::limit('Laravel is awesome framework', 10);
// "Laravel is..."
Use case: Превью статей, описание товара в карточке, превью комментариев.
Поиск в строке

Str::contains() / startsWith() / endsWith()

Подстроковые проверки.

Str::contains('user@gmail.com', '@gmail.com');   // true
Str::startsWith('https://site.com', 'https');   // true
Str::endsWith('report.pdf', '.pdf');          // true
Use case: Определение домена email, протокол URL, расширение файла.
Случайные значения

Str::random()

Криптостойкая случайная строка указанной длины.

$token = Str::random(32);
// "d8ks92j3lqp93jf02ldk9as8dj29dkfj"
Use case: API-токены, invitation-коды, password reset tokens, magic links.
Преобразование текста

Str::replace()

Замена всех вхождений (или массива).

Str::replace('Java', 'Laravel', 'I love Java.');
// "I love Laravel."
Use case: Шаблоны писем (плейсхолдеры), маскирование данных, чистка текста.

Str::upper() / lower() / title()

Регистровые преобразования с поддержкой Unicode.

Str::upper('laravel');                // "LARAVEL"
Str::lower('LARAVEL');                // "laravel"
Str::title('hello world');           // "Hello World"
Use case: Нормализация email/username перед сохранением, форматирование имён.

Str::camel() / snake() / kebab() / studly()

Конвертация между стилями именования.

Str::camel('hello_world');    // "helloWorld"
Str::snake('HelloWorld');     // "hello_world"
Str::kebab('HelloWorld');     // "hello-world"
Str::studly('hello_world');   // "HelloWorld" (PascalCase)
Use case: Генерация имён классов/методов, API-ключи в snake_case, CSS-классы в kebab-case.
Идентификаторы

Str::uuid() / Str::ulid()

Генерация UUID v4 / ULID (сортируемый по времени).

$id = (string) Str::uuid();
// "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

$id = (string) Str::ulid();
Use case: Публичные ID (не утечь auto-increment), distributed ID, ключи для S3.
Arrays — Arr хелперы

Фасад Illuminate\Support\Arr — операции над PHP-массивами с поддержкой dot-notation для вложенных ключей.

Доступ по ключу

Arr::get()

Безопасное чтение по dot-пути. Не падает на отсутствующих ключах.

$data = ['user' => ['profile' => ['email' => 'a@x.com']]];

Arr::get($data, 'user.profile.email');     // "a@x.com"
Arr::get($data, 'user.profile.phone', 'N/A'); // "N/A"
Use case: Чтение JSON-ответов API без каскадов isset().

Arr::has()

Проверка существования по dot-пути.

if (Arr::has($data, 'user.profile.email')) { ... }
Use case: Опциональные конфиги, проверка вложенных ключей в payload.
Whitelist / Blacklist

Arr::only() / Arr::except()

Whitelist / blacklist ключей.

Arr::only($user, ['id', 'name', 'email']);
Arr::except($user, ['password', 'token']);
Use case: Подготовка публичного API-ответа, удаление чувствительных полей перед логированием.
Мутация

Arr::set() / Arr::forget()

Установка / удаление по dot-пути. Создаёт вложенные структуры при необходимости.

$data = [];
Arr::set($data, 'user.profile.email', 'a@x.com');
// ['user' => ['profile' => ['email' => 'a@x.com']]]

Arr::forget($data, 'user.profile.email');
Use case: Динамическое построение конфигов, мутация nested данных.
Извлечение / поиск

Arr::pluck()

Извлечь колонку из массива объектов/массивов.

Arr::pluck($users, 'email');
Arr::pluck($users, 'email', 'id'); // [id => email]
Use case: То же, что collection pluck, но для raw PHP-массивов.

Arr::first() / Arr::last()

Первый/последний элемент, опц. по условию.

Arr::first([10, 20, 30], fn($v) => $v > 15); // 20
Use case: Найти первый матч без явного цикла.
Структура / преобразование

Arr::flatten() / Arr::collapse()

Сплющивание вложенных массивов.

Arr::flatten([['a','b'], ['c']]);  // ['a','b','c']
Arr::collapse([[1,2], [3,4]]);  // [1,2,3,4]
Use case: Сведение групп тегов в один список, объединение результатов из chunk'ов.

Arr::wrap()

Если не массив — обернёт в массив. null → [].

Arr::wrap('apple');   // ['apple']
Arr::wrap(['a', 'b']); // ['a', 'b']
Arr::wrap(null);      // []
Use case: API, где параметр может быть скаляром или массивом — всегда приводи к массиву.

Arr::random()

Случайный элемент (или несколько).

Arr::random(['red', 'blue', 'green']);
Arr::random(['red', 'blue', 'green'], 2); // 2 случайных
Use case: Случайные баннеры, A/B тестирование, тестовые данные.
Dates & Time — Carbon

Все даты в Laravel — Carbon\Carbon (расширение PHP DateTime). Eloquent timestamps (created_at, updated_at) тоже Carbon-инстансы.

Текущее время

now() / today()

Текущее время / начало текущего дня (00:00:00).

now();    // 2026-05-14 18:35:42
today();  // 2026-05-14 00:00:00
Use case: Timestamps в БД, расчёт дедлайнов от текущего момента.
Арифметика дат

addDays() / subDays() / addHours() / subMinutes()

Математика над датами. Возвращает новый Carbon-инстанс (chainable).

now()->addDays(7);          // +7 дней
now()->subHours(2);         // -2 часа
now()->addMonths(3)->endOfDay(); // +3 месяца, конец дня
Use case: Trial-период, истечение токена, дата следующего платежа.
Форматирование & вывод

format()

Формат вывода (через стандартные PHP-токены: Y, m, d, H, i, s).

now()->format('d/m/Y H:i');   // "14/05/2026 18:35"
now()->format('Y-m-d');       // "2026-05-14"
Use case: Локализованный вывод дат в UI, ключи логов.

diffForHumans()

Человеко-читаемое расхождение: «5 минут назад», «in 3 days».

now()->subMinutes(10)->diffForHumans();
// "10 minutes ago"

now()->addDays(3)->diffForHumans();
// "in 3 days"
Use case: Ленты, уведомления, активность — «комментарий 5 минут назад».
Парсинг

Carbon::parse()

Парсинг строки в Carbon-объект.

use Carbon\Carbon;

$date = Carbon::parse('2026-12-31 23:59:59');
$date->format('l, d M Y'); // "Thursday, 31 Dec 2026"
Use case: Конвертация строк из API/CSV в Carbon перед сохранением или сравнением.
Проверки

isPast() / isFuture() / isToday()

Булевые проверки.

if ($user->trial_ends_at->isPast()) {
    deactivate($user);
}
Use case: Проверка просроченных подписок, токенов, событий.
Session & Authentication
Сессия

session()

Чтение / запись сессии. Без аргументов — возвращает менеджер.

session(['cart_count' => 5]);    // записать
$count = session('cart_count', 0); // читать с default
session()->forget('cart_count');    // удалить
Use case: Корзина, шаги мастер-форм, временные настройки UI.

session()->flash()

Сохраняет значение только на следующий запрос.

session()->flash('status', 'Profile updated!');
// эквивалент: redirect()->with('status', '...')

// В Blade на следующей странице:
@if(session('status'))
    <div class="alert">{{ session('status') }}</div>
@endif
Use case: Однократные сообщения — «Сохранено», «Ошибка», «Удалено».
Текущий пользователь

auth()->user() / auth()->id()

Текущий аутентифицированный юзер (модель) или его ID.

$user   = auth()->user();
$userId = auth()->id();

// shortcut в Blade:
@auth
    Привет, {{ auth()->user()->name }}
@endauth
Use case: Авторская атрибуция (created_by => auth()->id()), персонализация UI.

auth()->check() / auth()->guest()

Аутентифицирован или нет.

if (auth()->check()) {
    // залогинен
}

if (auth()->guest()) {
    return redirect()->route('login');
}
Use case: Условный рендеринг, защита маршрутов вне middleware.
Пароли & вход

bcrypt() / Hash::make()

Хэширование пароля. Алгоритм bcrypt с salt.

User::create([
    'email'    => $request->input('email'),
    'password' => bcrypt($request->input('password')),
]);

// При логине — Hash::check() сравнивает без расхэширования:
Hash::check($plain, $user->password);
Use case: Регистрация, смена пароля. Никогда не сохраняй plain-пароли.

Auth::attempt() / Auth::logout()

Логин по credentials и выход из сессии.

if (Auth::attempt([
    'email'    => $request->email,
    'password' => $request->password,
])) {
    $request->session()->regenerate(); // защита от session fixation
    return redirect()->intended('/');
}

Auth::logout();
Use case: Кастомный login-контроллер.
Routing & Views
Генерация URL

route()

URL по имени маршрута. Параметры подставляются автоматически.

// routes/web.php
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');

// В контроллере / Blade
route('posts.show', $post);             // /posts/5
route('posts.show', ['post' => 5]);     // /posts/5
Use case: Никогда не хардкодь URL'ы — переименуешь путь и всё сломается.

url()

Абсолютный URL из пути.

url('/contact');          // https://site.com/contact
url()->current();         // URL текущей страницы
url()->previous();        // referrer
Use case: Письма, webhooks, OAuth-redirect URI.

asset()

URL к файлу в public/.

<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<img src="{{ asset('img/logo.png') }}">
Use case: CSS, JS, картинки в Blade. С Vite используется @vite().
Рендеринг Blade

view()

Рендеринг Blade-шаблона с данными.

return view('posts.show', [
    'post'     => $post,
    'comments' => $post->comments,
]);
Use case: Базовый возврат из контроллера.
Редиректы

redirect()

HTTP-редирект. Поддерживает имена маршрутов, обратные ссылки, flash-данные.

return redirect('/dashboard');
return redirect()->route('home');
return redirect()->back()->with('error', 'Wrong data');
return redirect()->intended('/'); // после login — туда, куда хотел юзер
Use case: После форм (POST → Redirect → GET), после логина, при ошибках валидации.

back()

Алиас redirect()->back().

return back()->withErrors($validator)->withInput();
Use case: Возврат на предыдущую страницу с ошибками валидации и сохранёнными данными формы.
Ответы (API)

response()->json()

JSON-ответ с правильными заголовками.

return response()->json([
    'status' => 'ok',
    'data'   => $user,
], 200);
Use case: API-эндпоинты, AJAX-ответы.
Debug & Misc
Отладка

dd() — dump & die

Печатает значение и завершает выполнение.

dd($user);
dd($request->all(), $user); // можно несколько
Use case: Основной инструмент отладки — посмотреть значение и остановиться.

dump()

Печатает, но не останавливает выполнение.

dump($step1);
dump($step2);
return view('page'); // выполнение продолжится
Use case: Логирование промежуточных значений без остановки.
Прерывание / guard'ы

abort()

Прервать запрос с HTTP-ошибкой.

abort(404);
abort(403, 'Доступ запрещён');
abort_if(!auth()->user()->isAdmin(), 403);
abort_unless($user->active, 403);
Use case: Защита маршрутов, гард ресурсов, ранний выход из метода.

throw_if() / throw_unless()

Условный throw — компактнее, чем if + throw.

throw_if($user->balance < 0, InsufficientFundsException::class);
throw_unless($user->verified, UnverifiedException::class);
Use case: Guard clauses в бизнес-логике.
Конфигурация & окружение

config()

Чтение / запись конфигурации (из config/*.php).

config('app.name');                       // чтение
config(['app.name' => 'NewApp']);          // запись (на runtime)
config('services.stripe.key');
Use case: Доступ к настройкам приложения. Предпочтительно config(), а не прямой env() в коде — конфиги кешируются.

env()

Чтение из .env. Работает только если config:cache НЕ запущен.

env('APP_ENV');                  // "local" / "production"
env('STRIPE_KEY', 'default');
Use case: Только в config/*.php файлах. В контроллерах используй config().
Кэш & утилиты

tap()

Выполняет действие над объектом и возвращает сам объект.

return tap(User::create($data), function ($user) {
    $user->sendWelcomeEmail();
}); // вернёт $user (а не результат sendWelcomeEmail)
Use case: Side-effect после создания / обновления модели без потери chainability.

cache()

Чтение / запись кэша.

cache(['key' => 'value'], now()->addMinutes(10));
cache('key', 'default');

// Remember pattern — если нет, вычислить и сохранить:
Cache::remember('users.count', 60, fn() => User::count());
Use case: Тяжёлые запросы (счётчики, агрегаты), внешние API.
Artisan CLI

Командная строка Laravel. Все артефакты (контроллеры, модели, миграции) генерируются командой.

Генерация
КомандаЧто делает
php artisan make:model Post -mfscМодель + миграция + factory + seeder + controller
php artisan make:controller PostController --resourceResource controller (7 методов CRUD)
php artisan make:request StorePostRequestFormRequest для валидации
php artisan make:migration create_posts_tableНовая миграция
php artisan make:seeder PostSeederSeeder
php artisan make:factory PostFactory --model=PostFactory
php artisan make:middleware EnsureUserIsAdminMiddleware
php artisan make:job ProcessPaymentJob для очереди
php artisan make:notification InvoicePaidNotification
php artisan make:mail OrderShippedMailable
php artisan make:event OrderPlacedEvent
php artisan make:listener SendOrderEmail --event=OrderPlacedListener
php artisan make:policy PostPolicy --model=PostAuthorization Policy
php artisan make:command SendReportsАртизан-команда
База данных
КомандаЧто делает
php artisan migrateПрименить новые миграции
php artisan migrate:rollbackОткатить последнюю партию
php artisan migrate:fresh --seedDrop all → migrate → seed (dev only!)
php artisan db:seedЗапустить DatabaseSeeder
php artisan db:seed --class=PostSeederОдин сидер
php artisan db:wipeУдалить ВСЕ таблицы (опасно)
Диагностика
КомандаЧто делает
php artisan route:listВсе маршруты с middleware и actions
php artisan route:list --name=userФильтр по имени
php artisan tinkerREPL — интерактивно дергать модели/код
php artisan aboutВерсии, окружение, кэши
php artisan config:show databaseПросмотр конфига секции
Очереди и расписание
КомандаЧто делает
php artisan queue:workВоркер очереди (foreground)
php artisan queue:listenВоркер, перезагружается при изменениях кода
php artisan queue:retry allПерезапустить failed jobs
php artisan schedule:workЛокальный планировщик (вместо cron)
Производительность / деплой
КомандаКогда
php artisan config:cacheНа проде — кэш конфигов
php artisan route:cacheНа проде — кэш маршрутов
php artisan view:cacheПрекомпилировать Blade
php artisan optimizeВсе кэши разом
php artisan optimize:clearСбросить все кэши (после изменений)
Tinker — лучший друг изучающего Laravel:
php artisan tinker

>>> User::count();
>>> User::factory()->count(10)->create();
>>> User::where('email', 'me@x.com')->first()->delete();
Шпаргалка — всё в одном

Сжатый эталон для быстрого вспоминания. Скопируй в Tinker для проверки.

Request
request('field');
$request->input('name', 'default');
$request->filled('email');
$request->has('promo');
$request->only(['email', 'name']);
$request->except(['_token', 'password']);
old('email');
Validation
$request->validate([
    'email'      => 'required|email|unique:users,email',
    'password'   => 'required|confirmed|min:8',
    'role'       => ['required', Rule::in(['admin', 'editor', 'user'])],
    'start_date' => 'required|date',
    'end_date'   => 'required|date|after:start_date',
    'tags'       => 'array',
    'tags.*'     => 'string|distinct',
    'profile'    => 'sometimes|json',
    'avatar'     => 'image|mimes:jpg,png|max:2048',
]);
Eloquent
User::all();
User::find(1);
User::findOrFail(1);
User::where('status', 'active')->get();
User::whereIn('id', [1,2,3])->get();
User::with('posts')->get();
User::whereHas('posts', fn($q) => $q->where('status', 'published'))->get();
Post::latest()->paginate(10);
User::where('email', $e)->exists();
Collections
$c = collect([1,2,3,4,5]);
$c->map(fn($n) => $n * 2);
$c->filter(fn($n) => $n % 2);
$c->sum();
$c->avg();
$c->contains(3);
$users->groupBy('role');
$users->pluck('name', 'id');
$users->sortBy('created_at');
Str / Arr
Str::slug('Hello World!');
Str::limit($text, 100);
Str::contains($email, '@gmail.com');
Str::random(32);
Str::uuid();

Arr::get($data, 'user.profile.email');
Arr::only($data, ['id', 'name']);
Arr::except($data, ['password']);
Arr::set($data, 'a.b.c', 1);
Arr::flatten([['a','b'],['c']]);
Carbon
now();
today();
now()->addDays(7);
now()->format('d/m/Y H:i');
now()->diffForHumans();
Carbon::parse('2026-12-31')->format('l, d M Y');
Session / Auth / Routing
session(['cart' => 3]);
session('cart', 0);
session()->flash('msg', 'Saved!');

auth()->user();
auth()->check();
auth()->id();
bcrypt('secret');

route('posts.show', ['post' => 5]);
url('/contact');
asset('css/app.css');
return redirect()->route('home');
return back()->with('error', 'Invalid');
return response()->json(['ok' => true]);
Debug / Misc
dd($user);
dump($data);
abort(403, 'Forbidden');
abort_if(!$ok, 403);
config('app.name');
env('APP_ENV');
cache('key', 'default');
tap(User::create($d), fn($u) => $u->notify());
Artisan
# Generation
php artisan make:model Post -mfsc
php artisan make:controller PostController --resource
php artisan make:request StorePostRequest
php artisan make:policy PostPolicy --model=Post

# Database
php artisan migrate
php artisan migrate:fresh --seed
php artisan db:seed

# Diagnostics
php artisan route:list
php artisan tinker
php artisan about

# Production
php artisan optimize
php artisan optimize:clear
Эта шпаргалка покрывает 95% повседневной работы. Сохраните в закладки — обращайтесь при написании любого контроллера или сервиса.
Под капотом: PHP за Laravel-хелперами

Каждый Laravel-хелпер — обёртка над стандартными PHP-функциями. Знать «внутренности» полезно на практике и когда нужно понять, почему что-то работает не так. Ниже — таблицы «Laravel → чистый PHP» для основных категорий.

Строки (Str::)
LaravelЧто делает под капотом (PHP)
Str::contains($haystack, $needle)PHP 8+: str_contains($haystack, $needle)
Str::startsWith($str, $prefix)PHP 8+: str_starts_with($str, $prefix)
Str::endsWith($str, $suffix)PHP 8+: str_ends_with($str, $suffix)
Str::upper($str)mb_strtoupper($str, 'UTF-8') (не strtoupper — та ломает кириллицу)
Str::lower($str)mb_strtolower($str, 'UTF-8')
Str::length($str)mb_strlen($str, 'UTF-8')
Str::limit($str, 30)mb_strlen($str) > 30 ? mb_substr($str, 0, 30) . '...' : $str
Str::replace($search, $replace, $subject)str_replace($search, $replace, $subject)
Str::random(32)substr(bin2hex(random_bytes(16)), 0, 32) (upgrade — base64)
Str::slug('Привет мир!')Транслитерация (Transliterator/iconv) → preg_replace('/[^A-Za-z0-9-]/', '-', ...) → strtolower
Str::camel('user_name')lcfirst(str_replace(' ', '', ucwords(str_replace(['_','-'], ' ', $str))))
Str::snake('userName')strtolower(preg_replace('/(.)(?=[A-Z])/', '$1_', $str))
Str::kebab('userName')Как snake, но с - вместо _
Str::title('hello world')mb_convert_case($str, MB_CASE_TITLE, 'UTF-8')
Массивы (Arr::)
LaravelPHP под капотом
Arr::get($arr, 'a.b.c', $default)Рекурсия: explode('.', $key) → цикл с isset($arr[$part]) → возврат $default, если хоть где нет
Arr::has($arr, 'a.b')Аналогично get, но возвращает bool
Arr::set($arr, 'a.b', $val)explode('.') → создание вложенных массивов через & reference
Arr::forget($arr, 'a.b')Как set, но в конце unset()
Arr::only($arr, ['a','b'])array_intersect_key($arr, array_flip($keys))
Arr::except($arr, ['a','b'])array_diff_key($arr, array_flip($keys))
Arr::pluck($arr, 'name')array_column($arr, 'name')
Arr::flatten($arr)Рекурсивный foreach: если элемент массив — array_merge($result, flatten($item))
Arr::wrap($val)is_array($val) ? $val : ($val === null ? [] : [$val])
Arr::first($arr, $callback)foreach + if $callback($v) return $v
Arr::random($arr)$arr[array_rand($arr)]
Collections

Collection — это класс-обёртка над массивом. collect([1,2,3]) = new \Illuminate\Support\Collection([1,2,3]). Каждый метод либо использует нативную функцию PHP, либо делает свой foreach.

LaravelPHP-эквивалент
collect($arr)new Collection($arr) — просто обёртка
->map($fn)array_map($fn, $arr)
->filter($fn)array_filter($arr, $fn)
->reduce($fn, $init)array_reduce($arr, $fn, $init)
->pluck('name')array_column($arr, 'name')
->keys() / ->values()array_keys($arr) / array_values($arr)
->sum()array_sum($arr)
->avg()array_sum($arr) / count($arr)
->count()count($arr)
->contains($val)in_array($val, $arr, true) или foreach + callback
->groupBy('field')Свой foreach: $grouped[$item[$field]][] = $item
->sortBy('age')usort($arr, fn($a,$b) => $a['age'] <=> $b['age'])
->chunk(3)array_chunk($arr, 3)
->flatten()Рекурсивный обход через foreach
->toArray()Возвращает исходный массив (для вложенных Collections — рекурсивно)
->toJson()json_encode($arr)
Collection — immutable-стиль: методы возвращают новую Collection, не мутируют исходную. Отличие от нативных PHP-функций типа sort() которые мутируют массив.
Даты (Carbon)

Carbon — обёртка над встроенным PHP-классом DateTime / DateTimeImmutable. Всё что делает Carbon — можно сделать нативно.

LaravelPHP-эквивалент
now()new DateTime() с timezone из config('app.timezone')
today()new DateTime('today') — сегодня в 00:00:00
$date->addDays(5)$date->modify('+5 days') или $date->add(new DateInterval('P5D'))
$date->subHours(2)$date->modify('-2 hours')
$date->format('Y-m-d')$date->format('Y-m-d') — идентично, Carbon наследует
Carbon::parse('2026-01-15')new DateTime('2026-01-15') или DateTime::createFromFormat(...)
$a->diffInDays($b)$a->diff($b)->days
$date->diffForHumans()Свой алгоритм: diff() + локализация («2 часа назад»)
$date->toDateTimeString()$date->format('Y-m-d H:i:s')
Session & Auth
LaravelPHP-эквивалент
session('key')Драйвер решает: file → $_SESSION['key'] после session_start(); redis → Redis::get("session:$id:key")
session(['k' => $v])$_SESSION['k'] = $v (для file-драйвера)
session()->flash('msg', 'ok')$_SESSION['_flash']['msg'] = 'ok', автоочистка на след. запросе
bcrypt($password)password_hash($password, PASSWORD_BCRYPT, ['rounds' => 10])
Hash::check($pass, $hash)password_verify($pass, $hash)
auth()->user()Guard → сессия/токен → User::find($id) (кешируется в память запроса)
auth()->check()!is_null($this->user())
auth()->id()$_SESSION['login_user_web_...'] ?? null
csrf_token()$_SESSION['_token'] (генерируется как Str::random(40) при старте)
Responses & Redirects
LaravelPHP-эквивалент
response('Hello', 200)http_response_code(200); echo 'Hello';
response()->json($data)header('Content-Type: application/json'); echo json_encode($data);
response()->json($data, 422)+ http_response_code(422)
redirect('/home')header('Location: /home'); exit;
redirect()->route('users.show', $id)header('Location: ' . url_by_route_name(...)); exit;
back()header('Location: ' . $_SERVER['HTTP_REFERER']); exit;
abort(404)throw new HttpException(404) → exception handler → рендер 404-view
abort_if($cond, 403)if ($cond) throw new HttpException(403);
Debug, Config, Env
LaravelPHP-эквивалент
dd($var)Обёртка: Symfony\VarDumper::dump($var); die(); (расширенный var_dump)
dump($var)То же, но без die()
env('APP_KEY')getenv('APP_KEY') ?: $_ENV['APP_KEY'] ?? $_SERVER['APP_KEY'] (через vlucas/phpdotenv)
config('app.name')Arr::get($configArray, 'app.name') где $configArray собран из config/*.php
collect($arr)new Collection($arr)
optional($obj)->method()PHP 8+: $obj?->method() (nullsafe operator)
tap($val, fn($v) => $v->save())Вызов callback + возврат оригинала: $fn($val); return $val;
Validation правила
Laravel правилоPHP под капотом
requiredЗначение не null, не '', не пустой массив/файл
emailfilter_var($val, FILTER_VALIDATE_EMAIL) !== false
urlfilter_var($val, FILTER_VALIDATE_URL)
ip/ipv4/ipv6filter_var($val, FILTER_VALIDATE_IP) с флагами
numericis_numeric($val)
integerfilter_var($val, FILTER_VALIDATE_INT) !== false
booleanin_array($val, [true, false, 1, 0, '1', '0'], true)
jsonjson_decode($val) !== null && json_last_error() === JSON_ERROR_NONE
datestrtotime($val) !== false
regex:/pattern/preg_match($pattern, $val)
min:3, max:10Для строк — mb_strlen; для чисел — >=/<=; для массивов — count; для файлов — размер в KB
unique:users,emailDB::table('users')->where('email', $val)->count() === 0
exists:categories,idDB::table('categories')->where('id', $val)->exists()
mimes:jpg,pngfinfo_file(...) или $file->getMimeType() → сравнение
Eloquent → SQL под капотом

Каждый Eloquent-метод в итоге строит SQL и выполняет через PDO.

LaravelSQL (примерно)PHP (упрощённо)
User::find(5) SELECT * FROM users WHERE id = 5 LIMIT 1 $pdo->prepare(...)->execute([5])->fetch(PDO::FETCH_ASSOC)
User::where('active', 1)->get() SELECT * FROM users WHERE active = 1 PDO + fetchAll(PDO::FETCH_ASSOC) → hydration в объекты User
User::pluck('email') SELECT email FROM users PDO + fetchAll(PDO::FETCH_COLUMN)
User::whereIn('id', [1,2,3])->get() SELECT * FROM users WHERE id IN (?, ?, ?) PDO prepared с массивом плейсхолдеров
User::paginate(10) 2 запроса: COUNT(*) + SELECT ... LIMIT 10 OFFSET N 2 PDO вызова + расчёт страниц
User::with('posts')->get() SELECT * FROM users, потом SELECT * FROM posts WHERE user_id IN (...) — 2 запроса вместо N+1 PDO + hydration + подставление связей вручную по foreign_key
User::firstOrFail() SELECT ... LIMIT 1 PDO fetch, если null — throw new ModelNotFoundException
$user->save() INSERT если новый, UPDATE если существует PDO prepared + lastInsertId()
$user->delete() DELETE FROM users WHERE id = ? PDO prepared execute
Проверить сгенерированный SQL в Tinker: User::where('active', 1)->toSql() — вернёт строку запроса. Или DB::enableQueryLog() + DB::getQueryLog() для реального выполненного SQL с параметрами.
Routing & URL
LaravelPHP-эквивалент
route('users.show', 5)Поиск роута в реестре по имени + подстановка параметров в pattern → полный URL
url('/foo')Конкатенация: $request->getSchemeAndHttpHost() . '/foo'
asset('css/app.css')url() + '/css/app.css', с учётом ASSET_URL для CDN
view('users.show', ['user' => $u])Blade-компилятор: .blade.php → скомпилированный PHP в storage/framework/views/*.php → include + extract($data)
Итог: Laravel = красивая обёртка над стандартным PHP. Каждый хелпер разбирается на 1-3 нативные функции. Знание «внутренностей» ценится на практике и помогает быстро дебажить: если Str::slug() сработал странно — сразу ясно, что искать в Transliterator/iconv; если with() сделал 100 запросов — не сработала eager-загрузка через whereIn.