Команда Laravel випустила версію 12.4.0, що включає метод pipe() для побудови запитів, можливість умовно пропускати міграції, метод Arr::sole() та багато іншого
# Метод pipe() для побудови запитів
Тім Макдональд додав метод pipe() як до базового, так і до Eloquent побудовника запитів. Його функціонал аналогічний методу Collection::pipe():
$records = DB::query()
->from('...')
// ...
->tap(new TappableScope) // повертає запит
->pipe(new ActionScope); // виконує запит і повертає результат
# Пропуск міграцій
Дан Метьюз додав можливість програмно пропускати міграції, включивши необов'язковий метод shouldRun():
return new class extends Migration
{
public function shouldRun()
{
return Feature::active(Flights::class);
}
// ...
}
Метод shouldRun() враховується для команд migrate та rollback. Деталі дивись у документації з міграцій.
# Метод Arr::sole()
Ральф Дж. Сміт реалізував метод Arr::sole(), подібний до колекцій. Метод sole підтримує передачу простого масиву, який повертає перший елемент лише, якщо це єдиний елемент. Також можна передати виклик як другий аргумент:
Arr::sole(['foo']); // "foo"
// @throws \Illuminate\Support\ItemNotFoundException
Arr::sole(['foo'], fn (string $value) => $value === 'baz');
// @throws \Illuminate\Support\MultipleItemsFoundException
Arr::sole(['baz', 'foo', 'baz'], fn (string $value) => $value === 'baz');
# Queue fake Helper для слухачів
Люк Кузміш додав метод listenersPushed(), який дозволяє стверджувати, що слухач черги був доданий під час тесту:
Queue::fake();
event(new SomeEvent(value: 'look, a value!'));
$this->assertCount(
1,
Queue::listenersPushed(
SomeEventListener::class,
fn (SomeEvent $event) => $event->value === 'look, a value!'
)
);
# Метод Model except()
Вішал Чавда реалізував метод Model::except() для отримання атрибутів моделі, виключаючи певні ключі. Цей метод є оберненим до only():
$user->except('id', 'email');
# Метод assertDoesNotThrow
Гюнтер Дебрауер додав метод assertDoesntThrow() для зручної перевірки, що блок коду не викликає винятків:
$this->assertDoesntThrow(fn () => (new ProcessOrder)->execute());
Цей метод задокументовано у документації HTTP тестів.
# JSON-ствердження where Null і where Not Null
Фаісал Вахабалі додав методи whereNull() і whereNotNull() до екземплярів AssertableJson. Ось приклад з запиту:
// Використання:
fn (AssertableJson $json) => $json->whereNull('error')
// Приклад з тестів Фреймворку:
$assert = AssertableJson::fromArray([
'bar' => 'value',
]);
$this->expectException(AssertionFailedError::class);
$this->expectExceptionMessage('Property [bar] should be null.');
$assert->whereNull('bar');
# Примітки щодо випуску
Повний список нових можливостей та оновлень можна переглянути нижче, а також диф між версіями 12.3.0 і 12.4.0 на GitHub. Наступні примітки є частиною журналу змін:
# v12.4.0
- [12.x] Скидання пікових витрат пам'яті PHP при скиданні контексту для робітника черги від @TimWolla
- [12.x] Доданий каст
AsHtmlStringвід @ralphjsmit - [12.x] Доданий метод
Arr::sole()від @ralphjsmit - Поліпшено повідомлення про попередження в
ApiInstallCommandвід @sajjadhossainshohag - [12.x] Використано вже визначену властивість
relatedвід @browner12 - [12.x] Використано "class-string" там, де це доречно в реляціях від @browner12
- [12.x]
QueueFake::listenersPushed()від @cosmastech - [12.x] Додано метод except() до класу Model для виключення атрибутів від @vishal2931
- [12.x] виправлення: додано TPivotModel за замовчуванням і визначено властивість зв'язку в {Belongs,Morph}ToMany від @calebdw
- [12.x] видалено
@returnдокументацію на конструкторах від @browner12 - [12.x] Додано атрибут NamedScope від @shaedrich
- [12.x] Поліпшено підсвічування синтаксису для stub-файлів від @kayw-geek
- [12.x] Вибір
new CollectionзамістьCollection::makeвід @AhmedAlaa4611 - [12.x] Виправлено метод except() для підтримки кастованих значень від @vishal2931
- [12.x] Додано тестовий випадок для методу findSole від @mrvipchien
- [12.x] Типи: PasswordBroker::reset від @liamduckett
- [12.x] assertThrowsNothing від @gdebrauwer
- [12.x] Виправлення типу nullability на властивості PasswordBroker.events від @jnoordsij
- [12.x] Виправлення анотації типу повернення в методі decrementPendingJobs від @shane-zeng
- [12.x] Виправлення анотації типу повернення в методі compile від @shane-zeng
- [12.x] нове: Додано
whereNullіwhereNotNullуAssertableJsonвід @faissaloux - [12.x] виправлення: використання контекстних зв'язків у робочих залежностях від @calebdw
- Поліпшення типів повернення для
Illuminate\Queue\Jobs\Job::getJobId()таIlluminate\Queue\Jobs\DatabaseJob::getJobId()від @petrknap - Видалення залишкових тегів @return з конструкторів від @mohammadrasoulasghari
- [12.x] Різні виправлення генерації URL від @stancl
- Додано необов'язковий метод
shouldRunдо міграцій від @danmatthews - [12.x]
Uriзапобігання пустому рядку запиту від @rojtjo - [12.x] Викликати функцію ob_flush лише якщо є активний буфер у eventStream від @tonysm
- [12.x] Додано подію CacheFlushed від @tech-wolf-tw
- [12.x] Оновлення анотацій методів DateFactory для сумісності з Carbon v3 від @kayw-geek
- [12.x] Поліпшення документування методів, пов'язаних з файлами, від @SanderMuller
- [12.x] Підвищення якості документування для
FileViewFinderвід @imanghafoori1 - Підтримка використання нульового оператора з
nullвід @willrowe - [12.x] Виправлення: встановити однакові запити для пагінованих результатів різних сторінок від @tomchkk
- [12.x] Додано метод
pipeдля побудови запитів від @timacdonald - [12.x] виправлення: одне з багатьох підзапитів обмежено від @calebdw
- [12.x] виправлення(postgres): відсутні дужки у whereDate/whereTime для json-стовпців від @saibotk
- Виправлення створення фабрик через атрибути від @davidstoker
- [12.x] Виправлення Concurrency::run для збереження порядку результатів зворотного виклику від @chaker2710
- [12.x] Лог: Додати необов'язковий параметр keys до
Log::withoutContextдля видалення вибраного контексту з майбутніх логів від @mattroylloyd - [12.x] Додати тип
Expressionдо параметра$valueу методіQueryBuilderhaving()від @faissaloux - [12.x] Додати прапор для відключення where-клауз у методі
withAttributesна Eloquent Builder від @AndrewMast