Streamed JSON Responses Added to Laravel 10.43
Last updated on by Paul Redmond
The Laravel team released v10.43 with support for streamed JSON responses, passing a class name to register a global eloquent scope, a new insertOrIgnoreUsing
Eloquent method, and more.
This release was tagged on January 30th, but there are some excellent features added that we wanted to highlight. Here’s what’s new in the latest Laravel 10 release:
Add Support for Streamed JSON Responses
Peter Elmered contributed support for the StreamedJsonResponse
that was added in Symphony 6.3. The benefit is less memory usage for large data payloads.
Here’s an example of how you can use it from the pull request description:
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; } }}
Along with the streamJson
method is a new test helper to assert streamed JSON content:
$response->assertStreamedJsonContent([ 'data' => [ ['id' => 1], ['id' => 2], ['id' => 3], ],]);
You can learn more about this Symphony feature from their HttpFoundation Component documentation for Streaming a JSON Response.
insertOrIgnoreUsing
Method
New Eloquent Trevor Morris contributed an insertOrIgnoreUsing
method that “allows for bulk insert using sub-select to be successful if there are key conflicts, in connectors that support the ‘ignore’ functionality”:
$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
hasIndex()
Method
New Schema Hafez Divandari contributed a Schema::hasIndex()
method along with a few other methods that can be used as follows:
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[]
Use Class Names When Adding Global Scopes
Eliezer Margareten contributed the ability to pass a scope class name when adding a global scope to a model:
/** * The "booted" method of the model. */protected static function booted(): void{ static::addGlobalScope(AncientScope::class);}
In addition to that update, Eliezer contributed an addGlobalScopes()
method, which lets you register several global scopes at once:
/** * The "booted" method of the model. */protected static function booted(): void{ static::addGlobalScopes([FirstScope::class, SecondScope::class]);}
storage:unlink
Artisan Command
New Mikhail Salkov contributed a new Artisan command that deletes all symbolic links:
php artisan storage:unlink
Release notes
You can see the complete list of new features and updates below and the diff between 10.42.0 and 10.43.0 on GitHub. The following release notes are directly from the changelog:
v10.43.0
- [10.x] Add storage:unlink command by @salkovmx in https://github.com/laravel/framework/pull/49795
- [10.x] Unify
\Illuminate\Log\LogManager
method definition comments with\Psr\Logger\Interface
by @eusonlito in https://github.com/laravel/framework/pull/49805 - [10.x] class-name string argument for global scopes by @emargareten in https://github.com/laravel/framework/pull/49802
- [10.x] Add
hasIndex()
and minor Schema enhancements by @hafezdivandari in https://github.com/laravel/framework/pull/49796 - [10.x] Do not touch
BelongsToMany
relation when usingwithoutTouching
by @mateusjunges in https://github.com/laravel/framework/pull/49798 - [10.x] Check properties on mailables are initialized before sharing with the view by @j3j5 in https://github.com/laravel/framework/pull/49813
- [10.x] Remove duplicate actions/checkout from queue workflow by @Jubeki in https://github.com/laravel/framework/pull/49828
- [10.x] Add
insertOrIgnoreUsing
for Eloquent by @trovster in https://github.com/laravel/framework/pull/49827 - [10.x] Make
hasIndex()
Order-sensitive by @hafezdivandari in https://github.com/laravel/framework/pull/49840 - [10.x] Release action by @driesvints in https://github.com/laravel/framework/pull/49838
- [10.x] Add MariaDb1060Platform by @driesvints in https://github.com/laravel/framework/pull/49848
- [10.x] Unified Pivot and Model Doc Block
$guarded
by @eusonlito in https://github.com/laravel/framework/pull/49851 - [10.x] Introducing
beforeStartingTransaction
callback and use it inLazilyRefreshDatabase
by @pascalbaljet in https://github.com/laravel/framework/pull/49853 - [10.x] fix password max validation message by @MrPunyapal in https://github.com/laravel/framework/pull/49861
- [10.x] Fix validation message used for max file size by @mateusjunges in https://github.com/laravel/framework/pull/49879
- Update README.md by @foremtehan in https://github.com/laravel/framework/pull/49878
- [10.x] Adds
FormRequest[@getRules](https://github.com/getRules)()
method by @cosmastech in https://github.com/laravel/framework/pull/49860 - [10.x] add addGlobalScopes method by @emargareten in https://github.com/laravel/framework/pull/49880
- [10.x] Allow brick/math 0.12 by @LogicSatinn in https://github.com/laravel/framework/pull/49883
- [10.x] Add support for streamed JSON Response by @pelmered in https://github.com/laravel/framework/pull/49873
- [10.x] Using the native fopen exception in LockableFile.php by @eusonlito in https://github.com/laravel/framework/pull/49895
- [10.x] Fix LazilyRefreshDatabase when testing artisan commands by @iamgergo in https://github.com/laravel/framework/pull/49914
- [10.x] Fix expressions in with-functions doing aggregates by @tpetry in https://github.com/laravel/framework/pull/49912
- [10.x] Fix redis tag entries never becoming stale if cache ttl is past time by @jagers in https://github.com/laravel/framework/pull/49864
- [10.x] Fix - The
Translator
may incorrectly report the locale of a missing translation key by @VicGUTT in https://github.com/laravel/framework/pull/49900 - [10.x] fix Before/After validation rules by @MrPunyapal in https://github.com/laravel/framework/pull/49871