<? phpukraine ЕКОСИСТЕМА
⌕Пошук по платформі
LARAVEL · ЩО НОВОГО

Що нового в Laravel 10

  1. 01Laravel Pennant: офіційні feature flags з поступовим rollout через Lottery.
  2. 02Фасад Process запускає зовнішні команди, тримає пули паралельних процесів і підміняється в тестах.
  3. 03Типи в скелеті й стабах, ValidationRule для власних правил, test --profile і мінімум PHP 8.1.
СТАТУС Не підтримується
Реліз
14 лютого 2023
Останній патч
10.50.3
Активна підтримка до
06.08.2024
Безпека до
04.02.2025
НОВІ МОЖЛИВОСТІ · 6

Нові можливості

1.1 · ПАКЕТ

Laravel Pennant

Для feature flags зʼявився офіційний пакет, його ставлять окремо через composer. Прапорець описують через Feature::define(), перевіряють у коді або в Blade директивою @feature, а для поступового rollout є Lottery. Значення для користувача обчислюється один раз і зберігається, тому між запитами воно не змінюється.

+ LARAVEL 10
use Illuminate\Support\Lottery;
use Laravel\Pennant\Feature;

Feature::define('new-onboarding-flow', Lottery::odds(1, 10));

if (Feature::active('new-onboarding-flow')) {
    // ...
}

// у Blade: @feature('new-onboarding-flow') ... @endfeature
− LARAVEL 9
// самописний прапорець у config/features.php
if (config('features.new_onboarding')) {
    // ...
}
1.2 · НОВЕ

Фасад Process

Замість ручної роботи з Symfony Process тепер є фасад з коротким API. run() чекає завершення й повертає результат з output(), errorOutput() і successful(), а throw() кидає ProcessFailedException, якщо код виходу ненульовий. Теку, таймаут і змінні оточення задають ланцюжком перед запуском.

+ LARAVEL 10
use Illuminate\Support\Facades\Process;

$result = Process::path(base_path())->timeout(120)->run('ls -la')->throw();

$output = $result->output();
− LARAVEL 9
use Symfony\Component\Process\Process;

$process = new Process(['ls', '-la']);
$process->run();

$output = $process->getOutput();
1.3 · НОВЕ

Паралельні процеси

Раніше для паралельного запуску створювали кілька обʼєктів Symfony Process, викликали start() і окремим циклом чекали кожен. Тепер команди описують у пулі, concurrently() стартує їх одночасно, а результати зручно розібрати деструктуризацією масиву.

+ LARAVEL 10
use Illuminate\Process\Pool;
use Illuminate\Support\Facades\Process;

[$first, $second] = Process::concurrently(function (Pool $pool) {
    $pool->path(base_path())->command('bash import-1.sh');
    $pool->path(base_path())->command('bash import-2.sh');
});

echo $first->output();
− LARAVEL 9
$processes = [
    new Process(['bash', 'import-1.sh']),
    new Process(['bash', 'import-2.sh']),
];

foreach ($processes as $process) {
    $process->start();
}

foreach ($processes as $process) {
    $process->wait();
}
1.4 · НОВЕ

Process::fake() у тестах

Тест більше не мусить реально виконувати bash-скрипти. Після Process::fake() команди повертають підготовлений результат, а assertRan() перевіряє, що виклик був. Через Process::result() можна віддати свій output чи код виходу і так перевірити гілку з помилкою.

+ LARAVEL 10
Process::fake([
    'bash import.sh' => Process::result(output: 'Imported'),
]);

$this->get('/import');

Process::assertRan('bash import.sh');
1.5 · НОВЕ

Запит пропущених аргументів

Генератори реалізують інтерфейс PromptsForMissingInput, тож пропущений обовʼязковий аргумент Artisan просто запитує. Той самий інтерфейс можна додати до власної команди, а текст питань задати в promptForMissingArgumentsUsing(). Код зʼявився ще в Laravel 9.49, а release notes десятки подають його як частину релізу.

+ LARAVEL 10
php artisan make:controller
# What should the controller be named?
# > PodcastController
− LARAVEL 9
php artisan make:controller
# до 9.49: помилка, бракує аргументу name
1.6 · НОВЕ

Pest у новому проєкті

Хто пише тести на Pest, більше не переводить на нього свіжий проєкт вручну. Прапорець --pest в інсталяторі Laravel генерує застосунок з Pest-скафолдингом.

+ LARAVEL 10
laravel new example-application --pest
СИНТАКСИС · 2

Синтаксис

2.1 · ЗМІНА

Нативні типи у стабах

Усе, що створює make:*, одразу має типи параметрів і повернення, а дублюючі @param і @return з docblock-ів прибрані. Статичний аналіз і IDE бачать ту саму інформацію без коментарів. Старий код без типів працює як раніше, переписувати його не обовʼязково.

+ LARAVEL 10
use Symfony\Component\HttpFoundation\Response;

/**
 * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
 */
public function handle(Request $request, Closure $next): Response
{
    return $next($request);
}
− LARAVEL 9
/**
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
 * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
 */
public function handle(Request $request, Closure $next)
{
    return $next($request);
}
2.2 · ЗМІНА

ValidationRule для власних правил

Перевірка і текст помилки тепер живуть в одному методі. validate() отримує атрибут, значення і замикання $fail, яке викликають з повідомленням, коли значення не підходить. Прапорець --invokable з make:rule прибрали, бо правило з одним методом тепер створюється за замовчуванням.

+ LARAVEL 10
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class Uppercase implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (strtoupper($value) !== $value) {
            $fail('The :attribute must be uppercase.');
        }
    }
}
− LARAVEL 9
use Illuminate\Contracts\Validation\Rule;

class Uppercase implements Rule
{
    public function passes($attribute, $value)
    {
        return strtoupper($value) === $value;
    }

    public function message()
    {
        return 'The :attribute must be uppercase.';
    }
}
ФУНКЦІЇ · 3

Нові функції

3.1 · ЗМІНА

translate() у правилах-замиканнях

У правилі-замиканні $fail тепер повертає PotentiallyTranslatedString, як у класах ValidationRule, тож ключ перекладу передають напряму й викликають translate(). Кожен повторний виклик $fail додає ще одне повідомлення, попередні лишаються.

+ LARAVEL 10
'name' => [
    function ($attribute, $value, $fail) {
        $fail('validation.translation.key')->translate();
    },
],
− LARAVEL 9
'name' => [
    function ($attribute, $value, $fail) {
        $fail(__('validation.translation.key'));
    },
],
3.2 · НОВЕ

usePublicPath()

Коли веб-корінь на хостингу зветься public_html, раніше перевизначали path.public у контейнері. Тепер для цього є Application::usePublicPath(), і public_path() повертає вже новий шлях.

+ LARAVEL 10
app()->usePublicPath(base_path('public_html'));
− LARAVEL 9
app()->bind('path.public', fn () => base_path('public_html'));
3.3 · НОВЕ

lang:publish

Скелет нового застосунку більше не містить теку lang. Щоб змінити тексти валідації чи автентифікації або взяти їх за основу для свого перекладу, команда lang:publish створює lang/en зі стандартними файлами фреймворку.

+ LARAVEL 10
php artisan lang:publish
ПРОДУКТИВНІСТЬ · 1

Продуктивність

4.1 · НОВЕ

test --profile

Повільний набір зазвичай тягнуть кілька конкретних тестів, і їх треба знайти. З прапорцем --profile Artisan після прогону показує десять найповільніших, тож видно, з чого почати оптимізацію.

+ LARAVEL 10
php artisan test --profile
DEPRECATED

Застаріло

Ще працює, але дає попередження і зникне в одній із наступних версій.

Rule і InvokableRuleОбидва інтерфейси позначено @deprecated на користь ValidationRule з методом validate().
$routeMiddleware у HTTP KernelВластивість перейменовано на $middlewareAliases. Старе імʼя ще працює, але позначене застарілим.
BREAKING

Ламає сумісність

Перевірте це до оновлення: такий код перестане працювати або поводитиметься інакше.

PHP 8.1 і Composer 2.2Laravel 10 вимагає щонайменше PHP 8.1.0 і Composer 2.2.0.
Версії повʼязаних пакетівРазом із laravel/framework ^10.0 піднімаються Sanctum ^3.2, Passport ^11.0, doctrine/dbal ^3.0, spatie/laravel-ignition ^2.0 і laravel/ui ^4.0.
minimum-stabilityУ composer.json має стояти stable, або приберіть ключ, бо stable і так значення за замовчуванням.
(string) DB::raw()Вираз більше не приводиться до рядка, сирий SQL беруть через getValue() з граматикою зʼєднання.
$dates у моделяхВластивість видалено, дати оголошуйте в $casts з типом datetime.
Monolog 3Хто працює з Monolog напряму чи через Bugsnag або Rollbar, оновлює код і ці пакети під 3.x.
Cache::tags() з RedisТеги кешу рекомендовані лише для Memcached, з Redis upgrade guide радить перейти на Memcached або на Laravel 12.30.0.
expectsEvents() і expectsJobs()Трейт MocksApplicationServices видалено, замість його методів беріть Event::fake(), Bus::fake() і Notification::fake().
dispatch_now()Хелпер видалено, викликайте dispatch_sync() або Bus::dispatchSync().

Як оновитися

0 / 7