Команда Laravel выпустила версию 10.43 с поддержкой потоковых ответов JSON, передачей имени класса для регистрации глобальной области видимости Eloquent, новым insertOrIgnoreUsing
методом Eloquent и многим другим.
Этот релиз был отмечен 30 января, но в него добавлено несколько отличных функций, которые мы хотели бы выделить. Вот что нового в последнем выпуске Laravel 10:
Добавлена поддержка потоковых ответов JSONПитер Элмеред
внес свой вклад в поддержку того, что было добавлено в StreamedJsonResponse
Symphony 6.3. Преимущество заключается в меньшем использовании памяти для больших объемов данных.
Вот пример того, как вы можете использовать его, из описания запроса на вытягивание:Вместе с streamJson
методом есть новый помощник по тестированию для утверждения потокового содержимого JSON:
namespace App\Http\Controllers;
use Generator;
use App\Models\User;
class ExampleController extends Controller
{
public function index()
{
return response()->streamJson([
'users' => $this->yieldUsers(),
]);
}
protected function yieldUsers(): Generator
{
foreach (User::query()->cursor() as $user) {
yield $user;
}
}
}
$response->assertStreamedJsonContent([
'data' => [
['id' => 1],
['id' => 2],
['id' => 3],
],
]);
Вы можете узнать больше об этой функции Symphony из документации по компоненту HttpFoundation для потоковой передачи ответа JSON.
Новый метод Eloquent insertOrIgnoreUsing
Тревор
Моррис (Trevor Morris) внес свой вклад в метод, который «позволяет массовой вставке с использованием sub-select быть успешной в случае конфликтов ключей в коннекторах, поддерживающих функциональность игнорирования»:Новый метод схемы hasIndex()
Хафез Дивандари (Hafez Divandari) внес insertOrIgnoreUsing
свой вклад Schema::hasIndex()
в метод
$result = $builder->from('table1')->insertOrIgnoreUsing(
['foo'],
function (Builder $query) {
$query->select(['bar'])->from('table2')->where('foreign_id', '=', 5);
}
);
// MySQL:
// insert ignore into `table1` (`foo`) select `bar` from `table2` where `foreign_id` = ?'
// PostgreSQL:
// insert into "table1" ("foo") select "bar" from "table2" where "foreign_id" = ? on conflict do nothing
наряду с несколькими другими методами, которые можно использовать следующим образом:
Schema::hasIndex('users', 'my_index_name');
Schema::hasIndex('users', ['email']);
Schema::hasIndex('users', ['email'], 'unique');
Schema::hasIndex('users', ['id'], 'primary');
Schema::hasIndex('users', ['name', 'title'], 'fulltext');
Schema::getTableListing(); // string[]
Schema::getIndexListing('users'); // string[]
Использование имен классов при добавлении глобальных областей видимости
Элиэзер Маргаретен добавил возможность передавать имя класса области видимости при добавлении глобальной области видимости в модель:В дополнение к этому обновлению, Элиэзер внес метод, который позволяет регистрировать сразу несколько глобальных областей видимости:Новая storage:unlink
команда ArtisanМихаил Сальков
/**
* The "booted" method of the model.
*/
protected static function booted(): void
{
static::addGlobalScope(AncientScope::class);
}
внес addGlobalScopes()
свой вклад в новую команду Artisan, которая удаляет все символические ссылки:
/**
* The "booted" method of the model.
*/
protected static function booted(): void
{
static::addGlobalScopes([FirstScope::class, SecondScope::class]);
}
Примечания
php artisan storage:unlink
к выпуску Вы можете увидеть полный список новых функций и обновлений ниже,
а также различия между версиями 10.42.0 и 10.43.0 на GitHub. Следующие примечания к выпуску взяты непосредственно из журнала изменений:
v10.43.0
- [10.х] Добавьте команду storage:unlink с помощью @salkovmx в https://github.com/laravel/framework/pull/49795
- [10.х] Унифицируйте
\Illuminate\Log\LogManager
комментарии к определению метода с\Psr\Logger\Interface
помощью @eusonlito в https://github.com/laravel/framework/pull/49805 - [10.x] строковый аргумент имени класса для глобальных областей видимости @emargareten в https://github.com/laravel/framework/pull/49802
- [10.х] Добавление
hasIndex()
и незначительные улучшения схемы по @hafezdivandari в https://github.com/laravel/framework/pull/49796 - [10.х] Не трогайте
BelongsToMany
отношение при использованииwithoutTouching
by @mateusjunges в https://github.com/laravel/framework/pull/49798 - [10.х] Убедитесь, что свойства почтовых сообщений инициализированы перед предоставлением общего доступа к представлению @j3j5 в https://github.com/laravel/framework/pull/49813
- [10.х] Удаление дублирующихся действий/извлечения из рабочего процесса очереди путем @Jubeki в https://github.com/laravel/framework/pull/49828
- [10.х] Добавить
insertOrIgnoreUsing
для Eloquent от @trovster в https://github.com/laravel/framework/pull/49827 - [10.х] Сделайте
hasIndex()
Order-sensitive чувствительным к @hafezdivandari в https://github.com/laravel/framework/pull/49840 - [10.х] Действие отпуска @driesvints в https://github.com/laravel/framework/pull/49838
- [10.х] Добавьте MariaDb1060Platform с помощью @driesvints в https://github.com/laravel/framework/pull/49848
- [10.х] Унифицированный блок
$guarded
Pivot и Model Doc по @eusonlito в https://github.com/laravel/framework/pull/49851 - [10.х] Представляем
beforeStartingTransaction
callback и используем его в @pascalbaljet вLazilyRefreshDatabase
https://github.com/laravel/framework/pull/49853 - [10.x] Исправлено сообщение о проверке максимального пароля @MrPunyapal в https://github.com/laravel/framework/pull/49861
- [10.х] Исправлено сообщение о проверке, используемое для максимального размера файла, на @mateusjunges в https://github.com/laravel/framework/pull/49879
- Обновление README.md @foremtehan в https://github.com/laravel/framework/pull/49878
- [10.х] Добавляет
FormRequest[@getRules](https://github.com/getRules)()
метод по @cosmastech в https://github.com/laravel/framework/pull/49860 - [10.x] добавить метод addGlobalScopes, @emargareten в https://github.com/laravel/framework/pull/49880
- [10.х] Разрешить brick/math 0.12 на @LogicSatinn в https://github.com/laravel/framework/pull/49883
- [10.х] Добавлена поддержка потокового ответа JSON по @pelmered в https://github.com/laravel/framework/pull/49873
- [10.х] Использование собственного исключения fopen в LockableFile.php с помощью @eusonlito в https://github.com/laravel/framework/pull/49895
- [10.х] Исправление LazilyRefreshDatabase при тестировании команд artisan с помощью @iamgergo в https://github.com/laravel/framework/pull/49914
- [10.х] Исправление выражений в with-функциях, выполняющих статистические выражения по @tpetry в https://github.com/laravel/framework/pull/49912
- [10.х] Исправлена ошибка, из-за которой записи тегов redis никогда не устарели, если время ttl кэша истекло на @jagers в https://github.com/laravel/framework/pull/49864
- [10.х] Исправление - Может
Translator
неправильно сообщать локаль отсутствующего ключа перевода @VicGUTT в https://github.com/laravel/framework/pull/49900 - [10.x] исправление правил валидации «До/После» @MrPunyapal в https://github.com/laravel/framework/pull/49871