Трюки в Laravel #2

Представляю очередные трюки и нововведения в Laravel. На данный момент последняя вышедшая версия — 8.82.0


Транслитерация строки из специальных символов

Лиам Хакетт разработал метод, который производит транслитерацию специальных символов строки в их близкие ASCII-представлению.

Например, строка 'ⓐⓑⓒⓓⓔⓕⓖ' будет преобразована в строку 'abcdefg'.

Это нужно, например, для усиления безопасности при подборе логина-пароля для взлома учётной записи.

$value = 'ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ';
$this->assertSame(
    'abcdefghijklmnopqrstuvwxyz',
    Str::transliterate($value)
);

Новый метод для извлечения отрывка из текста

В версии 9.1 появился метод 'Str::excerpt', который получает отрывок из текста, соответствующий первому вхождению. Параметр radius добавляет символы до и после отрывка, а параметр omission — какие символы будут использоваться для заполнения.

use Illuminate\Support\Str;

$subtext = Str::excerpt('Семь раз отмерь', 'раз', [
    'radius' => 4,
    'omission' => ' (...) '

]);

// ' (...) емь раз отм (...) '


Способ избежать утечки памяти у обработчиков очереди.

Для этого рекомендуется перезапускать воркеры через определённые промежутки времени, например, через час.

# Установить максимальное количество задач и время, в течение которого будут выполняться задачи
php artisan queue:work --max-jobs=1000 --max-time=3600

# Либо можно добавить задачу в cron для рестарта очереди задач каждый час
0 * * * * forge php /path/to/artisan queue:restart


Альтернатива тернарным операторам

Philo Hermans напомнил, что есть метод optional() для замены тернарного оператора в Laravel.

$user = User::find(1);

// Использование тернарного оператора
$userId = $user ? $user->id : false;

// Альтернативный вариант с хелпером optional()
$userId = optional($user)->id;


Добавить элемент в MailMessage при определённом условии

Можно использовать метод when() в MailMessage, чтобы добавить элемент при определённом условии. Например, показать ссылку на скидку годового плана при оплате за месяц.

class InvoicePaid extends Notification
{
    public function toMail(User $user)
    {
        return (new MailMessage)
            ->success()
            ->line('Оплата получена')
            ->when($use->isOnMonthlyPaymentPlan(), function (MailMessage $message) {
                $message->action('Получите скидку 20% при оплате за год', route('account.billing'));
            })
            ->line('Спасибо!');
    }
}