Глубокое погружение в последние обновления и особенности Laravel

Глубокое погружение в последние обновления и особенности Laravel

Спустя более десяти лет после появления популярного фреймворка Laravel, задавались ли вы вопросом: ”Что еще Laravel может предложить PHP-разработчикам?”.

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

Так есть ли у Laravel еще сюрпризы в запасе для разработчиков Laravel? Или она исчерпала все возможные средства поддержки PHP-разработчиков?

По крайней мере, мы знаем, что Laravel 10 может многое предложить. Именно это мы и раскроем в этой статье, отправившись в путешествие по новым возможностям Laravel 10, исправлениям, а также свежеутраченным методам и пакетам.

График выхода Laravel

Раньше основная команда Laravel выпускала две основные версии в год - по одной каждые шесть месяцев.

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

Поскольку Laravel 9 выйдет 8 февраля 2022 года, ожидаемый график выпуска выглядит следующим образом:

  • Laravel 10: 7 февраля 2023 года
  • Laravel 11: 6 февраля 2024 года

Кроме того, согласно политике поддержки, исправления ошибок предлагаются в течение 18 месяцев, а обновления безопасности - в течение двух лет для всех версий Laravel.

Ниже приведен график ожидаемых исправлений ошибок и обновлений безопасности:

  • Laravel 9 будет продолжать получать исправления ошибок до 8 августа 2023 года и исправления безопасности до 6 февраля 2024 года.
  • Laravel 10 будет получать исправления ошибок до 6 августа 2024 года и исправления безопасности до 4 февраля 2025 года.
  • Ожидается, что Laravel 11 будет получать исправления ошибок до 4 августа 2025 года и исправления безопасности до 2 февраля 2026 года.

Стоит ли вам переходить на Laravel 10?

Важно помнить, что нам не всегда нужно обновлять версию Laravel для нашего приложения до последней версии, как только выходит новая версия.

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

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

Короче говоря, вам следует рассмотреть возможность перехода на Laravel 10, если:

  • Приложение стабильно в своей текущей версии и функционирует без проблем.
  • Новая версия либо добавляет функцию, которая необходима вашему приложению, либо устраняет проблему, с которой сталкивается ваше приложение.
  • Приложение будет хорошо протестировано, прежде чем изменения в обновлении будут запущены в производство.
  • into production.

Горячие обновления Laravel 10

Логотип Laravel 10
Изображение логотипа Laravel 10.

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

Новые возможности и обновления в Laravel 10

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

PHP 8.1: В основе Laravel 10

PHP 8.1 - это минимально необходимая версия PHP в Laravel 10. Судя по сравнению ветки Laravel 9 и основной ветки фреймворка на GitHub, некоторые функции PHP 8.1, такие как свойства readonly и array_is_list, будут представлены в Laravel 10.

Поддержка PHP 8.2

PHP 8.2 был выпущен 8 декабря 2022 года, всего за два месяца до даты выхода Laravel 10. Тем не менее, это не должно останавливать вас от использования возможностей PHP 8.2, поскольку, не делая ничего лишнего, Laravel 10 будет готов к PHP 8.2.

На самом деле, вся экосистема Laravel, включая Forge, Vapor и Envoyer, поддерживает PHP 8.2, и вы даже можете использовать PHP 8.2 в Laravel 9. Как это круто!

Обновление стартовых комплектов Laravel

Laravel Breeze и Jetstream готовы к использованию Laravel 10 после его выхода. Кроме того, они уже обновлены до Inertiajs 1, а JetStream ждет сюрприз - полная поддержка темного режима.

Обновление версии Predis

Predis - это надежный клиент Redis для PHP, который может помочь вам получить максимальную отдачу от кэширования для обеспечения фантастического пользовательского опыта. Раньше Laravel поддерживал обе версии 1 и 2, но начиная с Laravel 10, фреймворк больше не поддерживает Predis 1.

Хотя в документации Laravel упоминается Predis как пакет для взаимодействия с Redis, вы также можете использовать официальное расширение PHP. Это расширение предоставляет API для взаимодействия с серверами Redis.

Декларации нативных типов

Раньше Laravel использовал DocBlocks в своем скелетном коде, чтобы уточнить, что делает тот или иной фрагмент кода и какие параметры или ответы следует ожидать. Однако благодаря нативным объявлениям типов в Laravel 10 это изменится.

Лучше всего объяснить это изменение на простом примере. Вместо того чтобы функция выглядела следующим образом:

/**
* Determine whether the user can create models.
*
* @param  \{{ namespacedUserModel }}  $user
* @return \Illuminate\Auth\Access\Response|bool
*/
public function create({{ user }} $user)
{
    //
}

…вместо этого будет выглядеть так:

/**
* Determine whether the user can create models.
*/
public function create({{ user }} $user): bool
{
    //
}

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

Все правила валидации вызываются по умолчанию

Если бы вы хотели создать invokable правило валидации в Laravel 9, вам нужно было бы добавить флаг —invokable после команды artisan. Теперь в этом нет необходимости, так как все правила Laravel 10 по умолчанию являются вызываемыми. Итак, вы можете выполнить следующую команду для создания нового правила с возможностью вызова в Laravel 10:

php artisan make:rule CustomRule

Поддержка модификации нативных колонок

В попытке устранить необходимость использования пакета doctrine/dbal при использовании change() для изменения колонок, в Laravel 10 появится новая возможность. Эта возможность позволит разработчикам использовать метод change() и изменять столбцы в MySQL, PostgreSQL и SQL Server без необходимости использования дополнительных пакетов. Это значительное и рискованное изменение, но мы считаем, что оно того стоит, поскольку устранит необходимость в дополнительном пакете.

Чтобы лучше понять новую функцию, смотрите пример ниже:

$table
->integer('user_balance')
->unsigned()
->default(0)
->comment('balance'); 
// `user_balance` is an integer, unsigned, defaults to '0', and column comment is 'balance'

Итак, мы предполагаем, что у нас есть колонка user_balance и мы хотим изменить ее тип. Начиная с Laravel 10 мы можем просто сделать это:

$table
->bigInteger('user_balance')
->change(); 
// This will change `user_balance` to bigInteger instead of just integer

Приведенный выше код успешно изменит тип столбца, но при этом выпадут атрибуты UNSIGNED, DEFAULT и COMMENT. Поэтому важно помнить о добавлении всех атрибутов при изменении типа столбца:

$table
->bigInteger('user_balance')
->unsigned()
->default(0)
->comment('balance')
->change();

В случае, если у вас несколько соединений с базами данных и вы уже установили doctrine/dbal, рекомендуется вызвать метод Schema::useNativeSchemaOperationsIfPossible() в методе boot в App\Providers\AppServiceProvider, чтобы иметь возможность использовать родные операции схемы и использовать родные операции, прежде чем полагаться на пакет (SQLite, например, еще не поддерживает это):

use IlluminateSupportFacadesSchema;
 
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Schema::useNativeSchemaOperationsIfPossible();
    }
}

Тип колонки Нативное извлечение

Еще одной примечательной особенностью Laravel 10 является возможность использовать метод Schema::getColumnType без необходимости полагаться на пакет doctrine/dbal. В настоящее время мы используем Schema::getColumnType с doctrine/dbal для получения типа колонки. doctrine/dbal сопоставляет каждый собственный тип колонки с эквивалентным ему типом doctrine/dbal, и он не поддерживает многие типы колонок, используемые Laravel в различных базах данных.

С другой стороны, в Laravel 10 новый метод Schema::getColumnType будет возвращать реальный тип колонки, а не его эквивалент в doctrine/dbal. Это также позволит вам писать интеграционные тесты для новой встроенной функции модификации столбцов. Вы можете использовать эту функцию для получения либо имени типа данных, либо полного определения типа указанного столбца:

Schema::getColumnType('products', 'price'); // decimal

Более быстрый алгоритм хэширования

xxHash - это невероятно быстрый алгоритм хэширования. Он отличается большой случайностью и дисперсией вывода, а также уникальностью для уменьшения коллизий. Поскольку PHP 8.1 обеспечивает поддержку xxh128, а Laravel 10 работает на PHP 8.1, наличие такого надежного хэш-алгоритма в Laravel 10 является идеальным.

Стоит отметить, что Тейлор подчеркнул во время рассмотрения этого изменения, что некоторые пакеты сторонних разработчиков могут полагаться на то, что имена файлов будут иметь точный формат хэша SHA-1, который является алгоритмом, используемым Laravel для хэширования. Поэтому, если вы планируете обновление до Laravel 10, было бы разумно дважды проверить это в любых сторонних пакетах, которые вы используете в своем приложении.

Поддержка метода whereExists() для Eloquent Builder

В настоящее время использование whereExists() требует настройки вложенного запроса с помощью закрытия. К счастью, в Laravel 10 появилась возможность включать Eloquent Builder в качестве вложенного запроса. Это позволяет использовать пользовательские методы построителя, области действия модели и так далее.

Например, мы обычно делаем это, если хотим использовать whereExists():

Order::whereExists(function ($query) {
    $query->from('products')->whereColumn('products.order_id', 'orders.id');
});

В Laravel 10 мы можем сделать именно это:

Order::whereExists(
    Product::whereColumn('products.order_id', 'orders.id')
);

Оптимизация загрузки

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

В настоящее время при нетерпеливой загрузке отношений, у которых нет ключей для загрузки, Laravel все равно выполнит запрос, подобный этому select * from table_name where 0 = 1. Однако новое обновление Laravel 10 проверяет, есть ли ключи в наличии, и если нет, предоставляет пустую коллекцию, устраняя необходимость в ненужных запросах к базе данных.

Устаревшие методы и пакеты в Laravel 10

Laravel 10 попрощается с PHP 8.0

Фреймворк Laravel откажется от поддержки PHP 8.0 в Laravel 10. Следовательно, если вы планируете обновить свое приложение до Laravel 10, вам необходимо сначала обновить версию PHP до PHP 8.1 или PHP 8.2.

Удаление устаревших методов

Мы видим, что команда разработчиков ядра Laravel удаляет устаревшие методы Laravel 9 из ветки Laravel 10. Мы прогнозируем, что команда обновит руководство по обновлению документации, чтобы включить все устаревшие методы и пакеты, как только выйдет Laravel 10.

Если вы собираетесь перевести текущий проект на Laravel 10, любой код, использующий устаревший метод, должен быть переписан в новом подходе для достижения того же результата.

Здесь приведен список всех исправлений и исключений, которые мы обнаружили при сравнении Laravel 9 с основной веткой:

  • Метод Route::home (устарел в Laravel 9)
  • Устаревшие функции и методы вокруг dispatchNow. Это сделано для того, чтобы побудить разработчиков использовать dispatchSync, который является единственным поддерживаемым способом немедленной отправки.
  • getBaseQuery, поскольку у него есть эквивалент toBase.
  • Класс MaintenanceModeException, который больше не используется.
  • черта MocksApplicationServices
  • Метод Mail::failures подделки почты
  • Устаревшее свойство $dates, вместо него рекомендуется использовать $casts
  • Метод assertTimesSent()
  • Прекращена поддержка Predis 1 и doctrine/dbal 2
  • Все связанные устаревания в doctrine/dbal после того, как Laravel прекратил поддержку версии 2

Как установить Laravel 10

Laravel 10 уже доступен для ознакомления и тестирования его возможностей. Флаг -dev в программе установки Laravel устанавливает мастер-ветку из репозитория laravel/laravel. Все, что вам нужно будет сделать, это выполнить эту команду в терминале:

laravel new example-kinsta-app --dev

Или, если вы предпочитаете использовать Composer:

composer create-project --prefer-dist laravel/laravel example-kinsta-app dev-master

Чтобы лучше понять команду Composer, вот краткое объяснение:

  • laravel/laravel: Пакет для установки Laravel
  • example-kinsta-app: Новый каталог для вашего нового проекта (может быть изменен)
  • dev-master: Следующая версия Laravel (в данном случае Laravel 10)

После установки Laravel 10 вы можете подтвердить версию, перейдя в новый каталог example-kinsta-app и выполнив команду artisan:

$ php artisan --version
Laravel Framework 10.x-dev

Как обновить проект до Laravel 10

У вас есть соблазн перейти на Laravel 10? Основная команда Laravel упорно трудится над документацией, чтобы предоставить беспроблемное и понятное руководство по обновлению, охватывающее все возможные изменения. Не стесняйтесь ознакомиться с руководством по обновлению Laravel 10, поскольку некоторая информация о процессе обновления доступна уже сейчас.

Вам также следует следить за Laravel Shift после выхода Laravel 10. Он предлагает простой и автоматизированный подход к обновлению вашей версии Laravel.

В дополнение к документации Laravel и Laravel Shift мы в Kinsta опубликуем полное руководство по обновлению с реальными примерами. Поэтому не забудьте сохранить эту страницу в закладках и вернуться к ней после выхода Laravel 10.

Как развернуть проект Laravel 10

Развертывание Laravel 10 не должно сильно отличаться от развертывания проекта Laravel 9. Вот каковы, по нашему мнению, могут быть требования к серверу:

  • PHP >= 8.1
  • BCMath PHP Extension
  • Ctype PHP Extension
  • cURL PHP Extension
  • DOM PHP Extension
  • Fileinfo PHP Extension
  • JSON PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PCRE PHP Extension
  • PDO PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

Вы можете развернуть и разместить свой проект Laravel 10 на Kinsta в считанные минуты, поскольку Laravel является одним из длинного списка поддерживаемых фреймворков для размещаемых приложений.

Как внести вклад в Laravel 10

Хотя Laravel поддерживается основной командой, его активно развивают более 3 000 добровольных участников.

Хотите ли вы стать одним из них и помочь сформировать будущее Laravel? Если вы ответили ”да”, вы сможете помочь разработчикам по всему миру, добавив новую функцию, исправив ошибку или даже переписав запутанную часть документации.

Чтобы внести свой вклад в Laravel 10, вот что вам нужно сделать:

  1. Зайдите в репозиторий Laravel на GitHub и проверьте запросы на доработку, помеченные в заголовке [10.x]. Это даст вам четкое представление обо всех запросах на доработку для Laravel 10. Если один из PR касается вклада, который вы собирались внести, посмотрите, можете ли вы его улучшить.
  2. Если запланированный вами вклад еще не был рассмотрен кем-то другим, то вы можете создать PR самостоятельно.
  3. Не все стоит добавлять в кодовую базу фреймворка. Поэтому старайтесь вносить только те улучшения, которые будет легко поддерживать в будущем и которые помогут большинству членов сообщества Laravel.
  4. Соблюдайте рекомендации Laravel по внесению вкладов, чтобы ваши изменения были внесены в фреймворк.

Еще одна причина полюбить Laravel 10 - это возможность выиграть деньги за свой вклад с помощью охоты на ошибки! Мы рассмотрим их далее.

Конкурс по поиску ошибок в Laravel 10

Конкурс по поиску ошибок в Laravel 10
Конкурс по поиску ошибок в Laravel 10.

Laravel 10 объявил замечательный конкурс, в котором случайный участник имеет шанс выиграть 1000 долларов.

Это будет первый конкурс такого рода в истории Laravel. Он был разработан, чтобы поощрить сообщество к поиску и исправлению скрытых ошибок в Laravel 10.

Правила конкурса просты:

  • К рассмотрению принимаются только PR, отправленные в ветку 10.x репозитория laravel/framework.
  • Будут рассматриваться только "настоящие" исправления ошибок. Новые функции, рефакторинг и исправление опечаток не рассматриваются.
  • Каждое исправление должно быть подкреплено тестом.
  • Принятые исправления будут отмечены на GitHub, а в конце конкурса будет объявлен случайный победитель.

Конкурс завершится, когда будет выпущена первая стабильная версия Laravel 10. Любые запросы на исправление, которые к тому времени еще не будут рассмотрены или будут поданы после выхода Laravel 10, не будут участвовать в конкурсе.

Резюме

Это еще не все для этой статьи! Вплоть до даты релиза будут происходить новые изменения. Но на данный момент Laravel 10 выглядит чрезвычайно многообещающим, и мы с нетерпением ждем возможности рассказать обо всех тех дарах, которые он принесет в мир PHP.