Представляю очередные трюки и нововведения в 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;
Можно использовать метод 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('Спасибо!');
}
}