LaravelJuniorTechnical

Что такое Laravel и каковы его ключевые возможности?

Laravel — PHP MVC-фреймворк с Eloquent ORM, Blade-шаблонами, Artisan CLI, встроенными очередями, событиями и мощным DI-контейнером. Текущая версия — Laravel 11, требует PHP 8.2+.

Что такое Laravel

Laravel — это PHP-фреймворк с открытым исходным кодом, созданный Тейлором Отвеллом в 2011 году. Он реализует паттерн MVC (Model-View-Controller) и предоставляет богатую экосистему инструментов для разработки веб-приложений. Текущая стабильная ветка — Laravel 11 (2024), которая требует PHP 8.2+.

Ключевые возможности

  • Eloquent ORM — ActiveRecord-реализация для работы с базами данных. Каждая модель соответствует таблице и позволяет описывать связи (hasOne, hasMany, belongsTo, belongsToMany, morphTo).
  • Artisan CLI — консольный инструмент для генерации кода, запуска миграций, очередей, кастомных команд. Доступны сотни встроенных команд.
  • Blade-шаблонизатор — легковесный движок с директивами @if, @foreach, @include, @component, компонентами и слотами.
  • Migrations и Schema Builder — версионирование схемы БД через PHP-классы. Откат через php artisan migrate:rollback.
  • Service Container и IoC — мощный DI-контейнер с автоматическим разрешением зависимостей через конструктор и метод-инъекцию.
  • Queues — единый API для работы с очередями через драйверы database, Redis (Horizon), SQS, Beanstalkd.
  • Events и Listeners — встроенная система событий с возможностью отложенной обработки через очереди.
  • Broadcasting — real-time события через WebSockets (Laravel Echo + Reverb/Pusher).
  • Sanctum и Passport — аутентификация через токены (SPA, mobile) и полный OAuth2-сервер соответственно.
  • Laravel Telescope — отладочный дашборд для запросов, запросов к БД, событий, заданий очереди.

Пример: базовый маршрут и Eloquent-модель

<?php
// routes/api.php
use App\Http\Controllers\UserController;

Route::middleware('auth:sanctum')->group(function () {
    Route::get('/users', [UserController::class, 'index']);
    Route::get('/users/{user}', [UserController::class, 'show']);
    Route::post('/users', [UserController::class, 'store']);
});

// app/Models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class User extends Model
{
    protected $fillable = ['name', 'email', 'password'];

    protected $hidden = ['password', 'remember_token'];

    protected $casts = [
        'email_verified_at' => 'datetime',
        'password' => 'hashed',
    ];

    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}

// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index(): JsonResponse
    {
        return response()->json(
            User::with('posts')->paginate(20)
        );
    }

    public function store(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'name'     => 'required|string|max:255',
            'email'    => 'required|email|unique:users',
            'password' => 'required|min:8',
        ]);

        $user = User::create($validated);

        return response()->json($user, 201);
    }
}

Artisan-команды на старте проекта

composer create-project laravel/laravel my-app
cd my-app
php artisan migrate
php artisan make:model Post -mcr   # model + migration + controller (resourceful)
php artisan make:policy PostPolicy --model=Post
php artisan serve

Подводные камни

  • N+1 запросы — Eloquent не загружает связи автоматически. Без eager loading ($query->with('relation')) каждая итерация порождает отдельный SQL-запрос. Telescope покажет дубли.
  • $fillable vs $guarded — если оставить $guarded = [] (разрешить всё), можно пропустить mass-assignment уязвимость при передаче произвольных полей из запроса.
  • Blade кэширует скомпилированные шаблоны — в production после деплоя нужен php artisan view:clear, иначе старые шаблоны остаются.
  • Service Container и синглтоны — при регистрации сервиса через singleton() он живёт весь lifecycle запроса (или всего процесса в Octane), что может привести к утечке состояния между запросами.
  • Queue worker не перезапускается автоматически — после деплоя новых классов нужно php artisan queue:restart, иначе воркер продолжает работу с устаревшим кодом в памяти.
  • Миграции без транзакций — некоторые DDL-операции (особенно в MySQL) нельзя откатить транзакцией, поэтому ошибка в середине миграции оставляет схему в частично изменённом состоянии.
  • Глобальные scopes в Eloquent — если модель имеет глобальный scope (например, SoftDeletes), его легко забыть при отладке и получить неожиданно отфильтрованную выборку.
  • Octane и stateful код — при использовании Laravel Octane (Swoole/RoadRunner) статические свойства и синглтоны сохраняются между запросами; код, написанный в расчёте на PHP-FPM, может сломаться.

Common mistakes

  • Сводить framework overview к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Laravel 13 поверх PHP: request проходит через HTTP kernel, middleware, routing, controller/action и response pipeline.
  • Не отделять validation, authorization, transaction boundary и business logic.

What the interviewer is testing

  • Объясняет framework overview через конкретную точку lifecycle в Laravel.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

Sources

Related topics