Laravel 13 вышел 17 марта 2026 года, и история обновления необычайно проста: отсутствие критических изменений на уровне приложения по сравнению с Laravel 12, одно жесткое требование (PHP 8.3) и несколько функций, которые действительно полезны в рабочей среде, а не просто впечатляют в примечаниях к выпуску.

В этом посте основное внимание уделяется функциям, которые вы действительно получите в реальных клиентских проектах, а не исчерпывающему обзору. Полный обзор выпуска, контрольный список обновления и справочник по критическим изменениям см. в документе Laravel 13: функции, руководство по обновлению и критические изменения .

  Предварительные требования: PHP 8.3+, Laravel 13.x (последняя стабильная версия: 13.14.0 по состоянию на июнь 2026 г.), Composer 2.x.


1. Атрибуты PHP в моделях и контроллерах

В Laravel 13 добавлена ​​поддержка  #[Attribute]  в стиле PHP 8 в более чем 15 местах фреймворка. Старый синтаксис, основанный на свойствах, все еще работает — он является чисто аддитивным.

  О моделях Eloquent:

 use Illuminate\Database\Eloquent\Attributes\Table;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Hidden;

#[Table('posts', primaryKey: 'id', incrementing: true, timestamps: true)]
#[Fillable('title', 'body', 'user_id')]
#[Hidden('deleted_at')]
class Post extends Model {}
 

  На контроллерах:

 use Illuminate\Routing\Attributes\Controllers\Authorize;
use Illuminate\Routing\Attributes\Controllers\Middleware;

#[Middleware('auth')]
class CommentController extends Controller
{
    #[Middleware('subscribed')]
    #[Authorize('create', [Comment::class, 'post'])]
    public function store(Post $post) { }
}
 

  Когда это действительно следует использовать: Атрибуты лучше всего подходят для больших моделей предметной области, где объявления  $fillable  ,  $hidden  ,  $casts  и отношений разбросаны по всему классу. Совместное размещение определения таблицы и правил массового назначения в верхней части файла упрощает читаемость. На небольших моделях CRUD компромиссом являются дополнительные линии импорта для минимальной выгоды.

  Распространенная ошибка: Массовое преобразование каждой существующей модели в синтаксис атрибутов в одном PR. Он создает большие, шумные различия с нулевой выгодой во время выполнения и может привести к незначительным ошибкам, если вы пропустите какое-либо свойство. Мигрируйте постепенно, только при касании файла по другой причине.


2. Cache::touch() — увеличивает TTL без двустороннего обхода

 // Extends the expiry of 'session-token' by 2 hours without fetching or rewriting the value
Cache::touch('session-token', now()->addHours(2));
 

До этого для расширения TTL элемента кэша требовался цикл get → put, который тратил впустую обратный путь и сбрасывал значение без необходимости.  Cache::touch()  напрямую соответствует:

  •   Redis: одна команда   EXPIRE  
  •   Memcached: собственная операция   TOUCH  

  Практическое использование: Кэш, прилегающий к сеансу, дорогостоящие вычисляемые агрегаты, которые необходимо поддерживать в рабочем состоянии во время просмотра страницы, и счетчики ограничения скорости, в которых требуется поведение скользящего окна без перезаписи счетчика.

  Ограничение, которое необходимо знать: Если вы поддерживаете собственный драйвер хранилища кэша, он должен реализовывать метод  touch(string $key, $seconds) , иначе вы получите фатальную ошибку выполнения, как только любой путь кода вызовет  Cache::touch()  . Перед обновлением проверьте свои пользовательские драйверы.


3. Типизированное получение конфигурации

В Laravel 12 были типизированные помощники конфигурации, но несоответствия обнаруживались во время выполнения — часто в пути кода, который запускался только при определенных условиях. Laravel 13 выдает  ConfigTypeMismatchException  при загрузке.

 // Throws ConfigTypeMismatchException at boot if APP_DEBUG is not a boolean
$debug = config()->boolean('app.debug');

// Throws if CACHE_TTL is not an integer
$ttl = config()->integer('cache.ttl');
 

  Почему это важно в реальных проектах: Неправильно настроенные переменные среды — одна из наиболее частых причин скрытых производственных ошибок. Строка PHP   "true"  , передаваемая как логическое значение, является классическим режимом сбоя. С Laravel 13 ваше приложение будет отказываться загружаться с неверным типом конфигурации, а не будет работать несколько часов спустя в определенной функции.

  Компромисс: Это отказоустойчивая конструкция. Если ваша команда не привыкла к исключениям во время загрузки, первое развертывание после ввода типизированных вызовов конфигурации может вызвать тревогу. Добавляйте эти вызовы намеренно и проверяйте их в промежуточном режиме с фактической рабочей формой   .env   перед развертыванием.


4. JSON: ресурсы API «из коробки»

Ранее для обеспечения соответствия JSON:API требовался сторонний пакет. Laravel 13 поставляется с  JsonApiResource  изначально.

 use Illuminate\Http\Resources\JsonApi\JsonApiResource;

class PostResource extends JsonApiResource
{
    public function toAttributes($request): array
    {
        return [
            'title' => $this->title,
            'body'  => $this->body,
        ];
    }
}
 

В ответе автоматически используется   application/vnd.api+json   в качестве Content-Type и оборачивается полезная нагрузка в соответствующую спецификации структуру   data.attributes  .

Создайте его с помощью Artisan:

 php artisan make:resource PostResource --json-api
 

  Когда этот вариант предпочтительнее существующих пакетов: Для команд, создающих новые API, которым требуется базовое соответствие JSON:API — объекты ресурсов, связи и разреженные наборы полей — встроенный класс обрабатывает распространенные случаи с меньшими затратами на настройку. Командам со сложными требованиями к составным документам или существующим API, созданным на основе   cloudcreativity/laravel-json-api   , будет лучше, если они останутся в своем текущем пакете.


5. Queue::route() — Централизованная маршрутизация заданий

Раньше для назначения задания определенной очереди и соединению требовалась настройка каждого класса внутри свойств  $queue  и  $connection  каждого задания. В Laravel 13 представлена ​​централизованная маршрутизация:

 use Illuminate\Support\Facades\Queue;

// In a service provider or bootstrap/app.php
Queue::route(ProcessPodcast::class, queue: 'podcasts',   connection: 'redis');
Queue::route(SendEmailJob::class,   queue: 'emails',     connection: 'sqs');
Queue::route(GenerateReport::class, queue: 'reports',    connection: 'redis');
 

Это особенно полезно, когда классы заданий находятся в пакетах или коде поставщика и их нельзя изменить напрямую. Он также сохраняет решения по инфраструктуре (какое соединение, какая очередь) в одном месте, а не встраивает их в классы бизнес-логики.

  Компромисс с возможностью обнаружения: Правила маршрутизации, определенные у поставщика услуг, менее заметны разработчикам, читающим класс задания. Задокументируйте местоположение маршрутизации в README вашего проекта или оставьте комментарий в классе задания, указывающий на него.


6. Методы проверки очереди (добавлены в версии 13.8.0)

Для создания панелей администратора или панелей мониторинга очередей ранее требовались необработанные вызовы Redis или SQS. В Laravel 13.8.0 добавлена ​​собственная проверка:

 use Illuminate\Support\Facades\Queue;

$pending  = Queue::allPendingJobs();   // all pending jobs across every queue
$reserved = Queue::allReservedJobs();  // jobs currently being processed
$delayed  = Queue::allDelayedJobs();   // jobs waiting for their delay to expire
 

Эти коллекции возвратов вы можете фильтровать, подсчитывать и отображать. В том же выпуске также добавлены события приостановки и возобновления рабочего процесса, что обеспечивает плавные шаблоны истощения и перезапуска во время развертывания.


7. Laravel AI SDK становится стабильным

В эпоху Laravel 12 AI SDK находился в стадии бета-тестирования. Теперь это полностью стабильный сторонний API в Laravel 13. Его следует переоценить, если вы отклонили его во время бета-тестирования.

  Базовая генерация текста:

 use Laravel\AI\Facades\AI;

$response = AI::text()
    ->using('openai', 'gpt-4o')
    ->prompt('Summarize this article: ' . $article)
    ->generate();

echo $response->text();
 

  Встраивания и векторный поиск (с PostgreSQL + pgvector):

 $embedding = AI::embeddings()
    ->using('openai', 'text-embedding-3-small')
    ->input('What is the refund policy?')
    ->generate();

$results = Post::query()
    ->nearestTo('embedding_column', $embedding->vector)
    ->limit(5)
    ->get();
 

Поддерживаемые провайдеры: OpenAI, Anthropic (Claude), Google Gemini. SDK также охватывает агенты вызова инструментов, генерацию изображений, а также синтез и транскрипцию звука с помощью одного и того же унифицированного API.

  Примечание по безопасности: Учетные данные поставщика ИИ должны находиться только в  .env  . SDK считывает файл   config/ai.php   , который ссылается на переменные среды. Никогда не записывайте жестко код и не фиксируйте ключи API.

  Компромисс по сравнению с пакетами сообщества: Prism и PHP-пакет OpenAI могут поддерживать новые функции модели раньше, поскольку собственный SDK развивается размеренными темпами. Если вам нужен доступ к передовым возможностям моделей в день их выпуска, оцените пакеты сообщества. Для стабильного использования Laravel по умолчанию теперь используется собственный SDK.


Единственный настоящий блокировщик: PHP 8.3

Благодаря нулевым критическим изменениям на уровне приложения обновление с Laravel 12 до 13 является простым — если только ваша среда хостинга все еще не использует PHP 8.2. Срок службы PHP 8.2 заканчивается в декабре 2026 года, поэтому требование Laravel 13 также является стимулом к ​​отказу от среды выполнения, которая перестанет получать исправления безопасности.

Перед запуском   обновления композитора   подтвердите свою версию PHP:

 php -v
# Should show PHP 8.3.x or higher
 

Если вы используете Laravel Boost (  laravel/boost ^2.0 ), команда  /upgrade-laravel-v13  внутри Claude Code, Cursor или VS Code автоматизирует большинство этапов механического обновления. Вам по-прежнему необходимо вручную проверять   config/cache.php   (значение по умолчанию  serializable_classes  изменено на   false   ) и вашу конфигурацию CSRF.


Тестирование функций, которые вы используете

  •   Атрибуты PHP: Запустите  php artisan model:show Post , чтобы убедиться, что модель правильно разрешает свою таблицу и заполняемые правила после преобразования в синтаксис атрибутов.
  •   Cache::touch(): Напишите модульный тест, который подтверждает изменение TTL без изменения значения. Используйте  Cache::fake()  и проверьте базовое хранилище.
  •   Типизированная конфигурация: Вызовите несоответствие типов в локальном   .env   и убедитесь, что  ConfigTypeMismatchException  выдается при загрузке, а не игнорируется молча.
  •  Queue inspection: In a local Horizon or queue worker setup, dispatch a delayed job and call  Queue::allDelayedJobs()  from Tinker to verify it appears.
  •   AI SDK: Протестируйте API реального поставщика в тесте функций с реальным, но недорогим вызовом (например, коротким внедрением) и смоделируйте фасад в модульных тестах.

Если вам нужна разработка Laravel в Мумбаи, Mumbai Web Designer создаст приложения Laravel промышленного уровня.