Тема
Сверка спеков с Laravel 11.x — что валидно и подходит
Все спеки в этой папке переписаны под Laravel 11. Проверено против официальной документации laravel.com/docs/11.x и API-референса api.laravel.com/docs/11.x. Дата сверки: 2026-07-10. Вывод: все 13 файлов спеков корректны для Laravel 11. Ниже — L11-специфика, учтённая в спеках, и пофайловая привязка утверждений к докам.
Жизненный цикл версии
- Релиз: 12.03.2024 · PHP 8.2–8.4
- Bug fixes: до 03.09.2025 · Security fixes: до 12.03.2026
- ⚠️ На дату сверки ветка 11.x уже вне окна security-поддержки — существующие проекты держать на последнем патче 11.x и планировать апгрейд; для новых проектов рассматривать актуальную мажорную версию.
Что специфично для Laravel 11 (учтено в спеках)
| Изменение L11 | Где отражено |
|---|---|
Слим-скелетон: нет Http/Kernel.php, Console/Kernel.php, Exceptions/Handler.php — всё в bootstrap/app.php (->withRouting(), ->withMiddleware(), ->withExceptions()) | controllers.md, code-quality.md |
Метод casts() в модели — рекомендуемый способ (свойство $casts работает; при конфликте приоритет у метода) | models.md |
CACHE_STORE вместо CACHE_DRIVER | docker.md |
Дефолты свежего .env: database-драйверы для cache/session/queue, БД — SQLite | docker.md, migrations.md, services.md |
Squashed-миграции 0001_01_01_* (users + sessions, cache, jobs) | migrations.md, services.md |
routes/api.php создаётся через php artisan install:api (+ Sanctum) | controllers.md |
Расписание — routes/console.php (Schedule::) или ->withSchedule() | services.md, seo.md |
Health-маршрут /up — ->withRouting(health: '/up') | controllers.md, docker.md |
Посекундный rate limiting Limit::perSecond() | controllers.md |
Слим-конфиги + php artisan config:publish | anti-hardcode.md |
| Pest предлагается при установке; PHPUnit полностью поддерживается | testing.md |
models.md — Eloquent Models
| Утверждение спеки | Раздел доки L11 | API-референс |
|---|---|---|
Касты обязательны на JSON/date/bool/enum; метод casts() | eloquent-mutators#attribute-casting | Model::casts() |
Attribute-синтаксис вместо getXxxAttribute() | eloquent-mutators#accessors-and-mutators | Casts\Attribute |
Обе стороны связей hasMany ↔ belongsTo, belongsToMany | eloquent-relationships | HasMany · BelongsToMany |
->with() явно, запрет $with в модели, N+1 = баг | eloquent-relationships#eager-loading | Builder::with() |
withCount() для подсчёта без загрузки | eloquent-relationships#counting-related-models | Builder::withCount() |
Scopes (scopeActive, scopePublished) | eloquent#query-scopes | — |
$fillable whitelist / $guarded | eloquent#mass-assignment | Model::$fillable |
| Soft Deletes только по бизнес-требованию | eloquent#soft-deleting | SoftDeletes |
controllers.md — Controllers, Routing, Middleware, Validation
| Утверждение спеки | Раздел доки L11 | API-референс |
|---|---|---|
Route Model Binding по slug ({product:slug}) | routing#implicit-binding | Route::get() |
scopeBindings() для вложенных моделей | routing#implicitly-scoping-bindings | Route::scopeBindings() |
Каждый роут через ->name() | routing#named-routes | Route::name() |
| 301 permanent redirect при смене URL | routing#redirect-routes | Router::permanentRedirect() |
| Fallback-роут для 404 | routing#fallback-routes | Route::fallback() |
install:api для API-роутов | routing#api-routes · releases | — |
Health-маршрут /up | releases#the-health-route | — |
FormRequest: authorize(), messages(), $redirectRoute | validation#form-request-validation | FormRequest |
unique:table,column с ignoreRecord/ignore | validation#rule-unique | Rule::unique() |
Middleware в bootstrap/app.php через ->withMiddleware() | middleware#registering-middleware | Configuration\Middleware |
throttle:X,Y + Limit::perSecond() | routing#rate-limiting | RateLimiter |
| API Resources для трансформации в JSON | eloquent-resources | JsonResource |
migrations.md — Migrations & Seeders
| Утверждение спеки | Раздел доки L11 | API-референс |
|---|---|---|
Squashed-миграции 0001_01_01_* в скелетоне | releases | — |
->constrained() + ->index() на FK | migrations#foreign-key-constraints | ForeignIdColumnDefinition::constrained() |
cascadeOnDelete() / nullOnDelete() / restrictOnDelete() | migrations#foreign-key-constraints | Blueprint |
->json('column')->nullable() | migrations#available-column-types | Blueprint::json() |
$table->enum('status', [...]) | migrations#available-column-types | Blueprint::enum() |
Composite index index(['a', 'b']), unique(), fullText() | migrations#creating-indexes | Blueprint::index() · Blueprint::fullText() |
down() обязателен, dropIfExists | migrations#migration-structure | Schema::dropIfExists() |
Seeders firstOrCreate / updateOrCreate (идемпотентность) | seeding | Model::updateOrCreate() |
Примечание: PostgreSQL-специфика (partial/GIN/covering-индексы через DB::statement, CREATE INDEX CONCURRENTLY, $withinTransaction = false) — не часть Laravel API, а прямой SQL. Валидно и не конфликтует с L11. $withinTransaction — свойство класса миграции, migrations#running-migrations.
relations.md — Smart Relations (pivot)
Проектная конвенция поверх стандартного belongsToMany. Всё соответствует L11:
- eloquent-relationships#many-to-many
- Дополнительные pivot-колонки (
is_primary,sort_order) → withPivot() has('services')фильтр по наличию связи → querying-relationship-existenceinsertOrIgnore()в сидерах → Query Builder::insertOrIgnore()
services.md — Services, Jobs, Events, Notifications
| Утверждение спеки | Раздел доки L11 | API-референс |
|---|---|---|
| DI через конструктор, auto-wiring | container#automatic-injection | Container |
Интерфейс → реализация bind, singleton | container#binding-basics | Application::singleton() |
DB::transaction() для атомарности | database#database-transactions | DB::transaction() |
Job: $tries, $backoff, failed() | queues#max-job-attempts-and-timeout · queues#dealing-with-failed-jobs | InteractsWithQueue |
SerializesModels — передавать модель/ID | queues | SerializesModels |
Расписание в routes/console.php (Schedule::) | scheduling#defining-schedules | Schedule |
Events — DTO, Listener → Service, ShouldQueue | events | ShouldQueue |
Notifications: каналы mail/database/custom, via(), queue | notifications | Notification |
blade.md — Blade Templates
| Утверждение спеки | Раздел доки L11 | API-референс |
|---|---|---|
экранирует, {!! !!} — доверенный HTML | blade#displaying-data | — |
@js($var) / @ для JS | blade#blade-and-javascript-frameworks | — |
| Anonymous vs class-based компоненты | blade#components | Component |
@props с типизацией и default | blade#data-properties-attributes | — |
@stack / @push для скриптов | blade#stacks | — |
@forelse / @empty | blade#loops | — |
@vite() для ассетов | vite#loading-your-scripts-and-styles | Vite::__invoke() |
@auth / @guest / @isset / @env | blade#authentication-directives | — |
filament.md — FilamentPHP Admin
Не часть Laravel core. Синтаксис в спеке — Filament 3 (
Section,Toggle,SpatieMediaLibraryFileUpload,TextColumn::make('relation.name'),SelectFilter,TernaryFilter). Filament 3 поддерживает Laravel 10/11 — валидно. Filament 4+ (иной синтаксис схем форм) — не использовать без отдельного решения.
- Docs: filamentphp.com/docs/3.x
afterSave()в CreateRecord/EditRecord +Cache::tags()->flush()— валидно, см. cache ниже.
testing.md — Testing
| Утверждение спеки | Раздел доки L11 | API-референс |
|---|---|---|
| Pest предлагается при установке, PHPUnit валиден | testing | — |
RefreshDatabase только на _test БД | database-testing#resetting-the-database-after-each-test | RefreshDatabase |
Дефолтный phpunit.xml: CACHE_STORE=array, SESSION_DRIVER=array, QUEUE_CONNECTION=sync | testing#environment | — |
Feature: HTTP-ассерты, статусы, $this->seed() | http-tests | TestResponse |
Mail::fake(), Queue::fake() | mocking#mail-fake · mocking#queue-fake | Mail::fake() |
--parallel | testing#running-tests-in-parallel | — |
seo.md — SEO
Проектная система (seo_blocks, шаблоны, Schema.org). Laravel-механики:
- Sitemap:
spatie/laravel-sitemap(пакет) — github.com/spatie/laravel-sitemap - Artisan-команда
sitemap:generate→ artisan#writing-commands - Расписание в
routes/console.php→ scheduling#defining-schedules - Всё остальное (meta, JSON-LD, robots.txt, canonical) — HTML/HTTP, вне версии Laravel.
docker.md — Docker
Инфраструктура, не Laravel API. Соответствует L11:
CACHE_STORE(в L11 переименован изCACHE_DRIVER),SESSION_DRIVER,QUEUE_CONNECTION→ cache#configuration · session#configurationqueue:work,schedule:work→ queues#running-the-queue-worker · scheduling#running-the-scheduler-locally- Healthcheck через
/up→ releases - opcache preloading,
.env/config()→ configuration
mcp.md, anti-hardcode.md, code-quality.md
Внутренние конвенции студии и правила выбора MCP-инструментов — вне Laravel API. Laravel-механики, которые они упоминают, валидны для L11:
config()вместоenv()в коде,config:publish→ configuration- PHP Enum + cast → eloquent-mutators#enum-casting
__()/trans()локализация → localizationCache::tags()->flush()(только Redis/Memcached) → cache#cache-tags · Repository::tags()throw_if()/throw_unless()→ helpers#method-throw-if- Исключения через
->withExceptions()вbootstrap/app.php→ errors chunk()/lazy()для больших выборок → eloquent#chunking-resultsdeclare(strict_types=1), constructor property promotion — PHP 8.2+ (требование L11), не Laravel-специфично.
Итог
| Файл | Вердикт для L11 | Замечания |
|---|---|---|
| models.md | ✅ Валиден | метод casts() — рекомендуемый в L11, отражено |
| controllers.md | ✅ Валиден | install:api, /up, ->withMiddleware() — отражено |
| migrations.md | ✅ Валиден | squashed-миграции L11 отражены; PG-специфика — сырой SQL, ок |
| relations.md | ✅ Валиден | — |
| services.md | ✅ Валиден | планировщик в routes/console.php отражён |
| blade.md | ✅ Валиден | — |
| filament.md | ✅ Валиден | Filament 3 (поддерживает L11) |
| testing.md | ✅ Валиден | дефолты phpunit.xml L11 отражены |
| seo.md | ✅ Валиден | вне версии Laravel |
| docker.md | ✅ Валиден | CACHE_STORE исправлен, /up healthcheck добавлен |
| mcp.md | ✅ Валиден | вне версии Laravel |
| anti-hardcode.md | ✅ Валиден | config:publish отражён |
| code-quality.md | ✅ Валиден | ->withExceptions() отражён |
Требования окружения L11: PHP 8.2+, поддержка до PHP 8.4. Официальные release notes: laravel.com/docs/11.x/releases.