Laravel 9.38

Laravel 9.38
👋
Хочешь поучаствовать в жизни сайта? Мы ищем авторов!

Уведомления и миддлвари умнеют, пока мы изолируем команды по процессам и трогаем моделей без лишнего шума.

Подходите по одному

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

Чтобы использовать Isolatable, реализуйте его для своей команды:

namespace App\Console\Commands;
 
use Illuminate\Console\Command;
use Illuminate\Contracts\Console\Isolatable;
 
class SendEmails extends Command implements Isolatable
{
    // ...
}

Затем выполните ее с флагом --isolated:

php artisan mail:send 1 --isolated

Команда migrate в Laravel уже реализует этот интерфейс.

Документация Isolatable.

Замена подключения к БД в сессии на лету

Метод setHandler на Illuminate\Session\Store позволяет заменить DatabaseSessionHandler, который в нем используется, если соединение к БД было переоткрыто.

Эта правка была замержена для исправления issue в библиотеке tenancy для Laravel.

Словарь замены спецсимволов в Str::slug

В Str::slug() можно передать словарь, который будет использоваться для замены спецсимволов при составлении слага:

$ php artisan tinker
 
>>> Str::slug('500$ bill');
=> "500-bill"
 
>>> Str::slug(
...     title: '500$ bill',
...     dictionary: ['@' => 'at', '$' => 'dollar']
... );
=> "500-dollar-bill"

Условные миддлвари для уведомлений

Добавили возможность задавать для уведомлений middleware в зависимости от "уведомляемого" и от канала уведомления.

Пример из PR:

public function middleware($notifiable, $channel)
{
    if ($notifiable instance of User && $notifiable->isAdmin()) {
        return [];
    }
 
    if ($channel == 'email') {
        return [new RateLimited('mailgun')];
    }
 
    return [];
}

Тихонько трогаем модельки

Новый метод touchQuietly() на моделях позволяет обновить дату изменения без создания каких-либо событий:

$model->touchQuietly()

Удаление миддлварей из группы

Метод removeMiddlewareFromGroup динамически удаляет миддлвари из групп:

$router->removeMiddlewareFromGroup(
    'web',
    'test-middleware'
);

Уведомлениям в очереди можно задавать максимальное количество исключений

Это может быть полезно, если уведомление часто отправляется повторно после ошибок, а сервис отправки ограничен rate-limit'ом или после n-й ошибки просто нет смысла отправлять уведомление еще раз.

Полный списк изменений можно увидеть на laravel-news.com.

Материал подготовлен с ❤️ редакцией Кухни IT.

Олег Ямников

Олег Ямников

Главный кухонный корреспондент.