Laracode
Laracode

Метод коллекции "times"

Знали ли вы, что в Laravel есть удобный метод коллекции под названием times? Он позволяет создать коллекцию, вызвав замыкание (Closure) N раз. Это может быть полезно при работе с днями или при генерации случайных строк.

<?php

$collection = Collection::times(10, function (int $number) {
    return $number * 9;
});

$collection->all();
// [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]

Методы increment и decrement

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

<?php

// Увеличить votes на 1
DB::table('users')->increment('votes');

// Увеличить votes на 5
DB::table('users')->increment('votes', 5);

// Уменьшить votes на 1
DB::table('users')->decrement('votes');

// Уменьшить votes на 5
DB::table('users')->decrement('votes', 5);

// Увеличить votes на 1 и задать name = 'John'
DB::table('users')->increment('votes', 1, ['name' => 'John']);

// Можно увеличивать несколько столбцов сразу
DB::table('users')->incrementEach([
    'votes' => 5,    // Will increment votes by 5    
    'balance' => 100, // Will increment balance by 100
]);

// Эти методы также работают с Eloquent
User::query()->incrementEach([
    'votes' => 5,    // Will increment votes by 5    
    'balance' => 100  // Will increment balance by 100
]);

Хелпер "words"

Иногда вам может понадобиться ограничить количество слов в строке. К счастью, в Laravel есть удобный хелпер words, который поможет сделать это буквально в одну строчку! 🚀

<?php

use Illuminate\Support\Str;

return Str::words("Рефакторинг без тестов — это плохая идея!", 3);
// Рефакторинг без тестов...

return Str::words("Рефакторинг без тестов — это плохая идея!", 3, ' 👀');
// Рефакторинг без тестов 👀

// Так же через str хелпер 😎
return str("Рефакторинг без тестов — это плохая идея!")->words(2);
// Рефакторинг без тестов...

Laravel методы whereKey и findMany

Знали ли вы, что в Laravel есть методы whereKey и findMany? Они делают ваши запросы where in более читаемыми, а также избавляет от необходимости запоминать имя первичного ключа 🚀

<?php

// 😕 Вместо этого
Post::whereIn('id', [1,2,3])->get();
Post::whereNotIn('id', [1,2,3])->get();

// 😎 Можно вот так
Post::whereKey([1,2,3])->get();
Post::whereKeyNot([1,2,3])->get();

// Или даже вот так
Post::findMany([1,2,3]);

Тестирование очередей

В Laravel 11 появилась новая возможность тестировать неудавшиеся, повторно запущенные или удалённые задачи очереди, что было затруднительно в предыдущих версиях! Теперь вы можете просто вызвать метод withFakeQueueInteractions у своей задачи (job) и проверить одно из перечисленных действий.

<?php

use App\Jobs\ProcessPodcast;

$job = (new ProcessPodcast)->withFakeQueueInteractions();

$job->handle();

$job->assertReleased(delay: 30);
$job->assertDeleted();
$job->assertNotDeleted();
$job->assertFailed();
$job->assertNotFailed();

Опциональные значения в тестах при помощи Faker

Если у вас есть столбцы в таблице, которые не являются обязательными, и вы хотите генерировать для них значения случайным образом, FakerPHP (используемый в Laravel под капотом) изначально поддерживает опциональные значения 🚀

<?php

// случайная цифра или null
fake()->optional()->randomDigit();

// шанс 90% получить NULL
fake()->optional($weight = 0.1)->randomDigit();

// шанс 10% получить NULL
fake()->optional($weight = 0.9)->randomDigit();

// шанс 90%  получить NULL
fake()->optional($weight = 10)->randomDigit;

// шанс 0% получить NULL
fake()->optional($weight = 100)->randomDigit;

// шанс 50% получить FALSE
fake()->optional($weight = 0.5, $default = false)->randomDigit();

// шанс 10% получить 'abc'
fake()->optional($weight = 0.9, $default = 'abc')->word();

Хелпер функция scan

Знали ли вы, что вы можете использовать хелпер scan для разбора строкового ввода в коллекцию согласно формату, поддерживаемому встроенной функцией sscanf в PHP? 🚀

<?php

$rgb = '#402A2A';

[$r, $g, $b] = str($rgb)->scan('#%2x%2x%2x');

// $r = 64, $g = 42, $b = 42

Blade директива readonly

Иногда нам требуется отображать поля формы только для чтения. Хотя это можно реализовать вручную, Laravel предоставляет удобную Blade-директиву @readonly, упрощающую эту задачу 🚀.

/** Вместо **/
<input type="email" name="email" {{ $user->isNotAdmin() ? 'readonly' : '' }} />

/** Используйте **/
<input type="email" name="email" @readonly($user->isNotAdmin()) />

Автозаполнение в командах

При создании консольных команд вы можете улучшить пользовательский опыт, реализовав автозаполнение для пользователя. Это можно сделать с помощью метода anticipate, предоставляемого Laravel 🚀

<?php

// Вы можете использовать массивы
$animal = $this->anticipate("Какое ваше любимое домашнее животное?", ['dogs', 'cats']);

// Или запускать closure, срабатывающее каждый раз, когда пользователь набирает символ
$animal = $this->anticipate("Какое ваше любимое домашнее животное?", function (string $input) {
    return Animal::query()
        ->where('name', 'LIKE', "$input%")
        ->pluck('name')
        ->toArray();
});

Сохранение модели вместе с отношениями

Знаете ли вы, что в Laravel с помощью метода push можно сохранить модель и все связанные с ней отношения одним действием, без необходимости обрабатывать каждую связь отдельно? 🚀

<?php

$post = Post::find(1);

$post->comments[0]->message = 'Сообщение';
$post->comments[0]->author->name = 'Имя автора';

// Вместо сохранения отдельных моделей
$post->comments[0]->author->save();
$post->comments[0]->save();

// Вы можете сохранить модель и все ее отношения
$post->push();