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.