Use the New Fluent Helper to Work With Multi-dimensional Arrays in Laravel 11.2
Published on by Paul Redmond
This week, the Laravel team released v11.2, which includes a fluent() support helper, a context() helper, improved handling of a missing database during a migrate
operation, and more.
Fluent Helper
Philo Hermans contributed a fluent()
helper function when working with multi-dimensional arrays. The Fluent
class has been in the Laravel framework for quite a while; however, this PR introduces a helper convenience method to create a fluent object instance:
$data = [ 'user' => [ 'name' => 'Philo', 'address' => [ 'city' => 'Amsterdam', 'country' => 'Netherlands', ] ], 'posts' => [ [ 'title' => 'Post 1', ], [ 'title' => 'Post 2', ] ]]; collect($data)->get('user');fluent($data)->user; collect($data)->get('user')['name'];fluent($data)->get('user.name'); collect(collect($data)->get('posts'))->pluck('title');fluent($data)->collect('posts')->pluck('title'); json_encode(collect($data)->get('user')['address']);fluent($data)->scope('user.address')->toJson();
Context Helper
Michael Nabil contributed a convenience context()
helper function for managing Context. Depending on the arguments passed, you can either add to context, get the context object, or retrieve it (with an optional custom default):
// Add user information to the contextcontext(['user' => auth()->user()]); // Retrieve the context object$context = context(); // Retrieve user information from the context$user = context('user'); // Optional custom default value if not found.$some_key = context('key_that_does_not_exist', false);
Default Value for Context Getters
Michael Nabil contributed support for a default value on Context getters:
// Before: Returns null if not foundContext::get('is_user');Context::getHidden('is_user'); // After: Returns `false` if not foundContext::get('is_user', false); // falseContext::getHidden('is_user', false); // falseContext::get('is_user'); // null
Job Chain Test Assertion Methods
Günther Debrauwer contributed assertHasChain()
and assertDoesntHaveChain()
methods:
public function test_job_chains_foo_bar_job(): void{ $job = new TestJob(); $job->handle(); $job->assertHasChain([ new FooBarJob(); ]); // $job->assertDoesntHaveChain();}
Better database creation/wipe handling
Dries Vints contributed better database failure handing (#50836) when running migrate
when a database isn't created yet, as well as updating the migrate:fresh
command to streamline the process when a database does not exist #50838:
If the
migrate:fresh
command is called while there isn't any database created yet, it'll fail when it tries to wipe the database. This PR fixes this by first checking if the migrations table exists and if not, immediately go to the migrate command by skipping the db:wipe command. This will invoke the migrate command flow and subsequently will reach the point where the command will ask the user to create the database.In combination with #50836 this will offer a more seamless experience for people attempting to install Jetstream through the Laravel installer and choosing to not create the database.
The above description is taken from Pull Request #50838.
String Trim Removes Invisible Characters
Dasun Tharanga contributed an update to the framework TrimStrings
middleware, where invisible characters are not trimmed during an HTTP request, which can cause issues when submitting forms. See Pull Request #50832 for details.
Release notes
You can see the complete list of new features and updates below and the diff between 11.1.0 and 11.2.0 on GitHub. The following release notes are directly from the changelog:
v11.2.0
- [11.x] Fix: update
[@param](https://github.com/param)
in some doc block by @saMahmoudzadeh in https://github.com/laravel/framework/pull/50827 - [11.x] Fix: update @return in some doc blocks by @saMahmoudzadeh in https://github.com/laravel/framework/pull/50826
- [11.x] Fix retrieving generated columns on legacy PostgreSQL by @hafezdivandari in https://github.com/laravel/framework/pull/50834
- [11.x] Trim invisible characters by @dasundev in https://github.com/laravel/framework/pull/50832
- [11.x] Add default value for
get
andgetHidden
onContext
by @michaelnabil230 in https://github.com/laravel/framework/pull/50824 - [11.x] Improves
serve
Artisan command by @nunomaduro in https://github.com/laravel/framework/pull/50821 - [11.x] Rehash user passwords when logging in once by @axlon in https://github.com/laravel/framework/pull/50843
- [11.x] Do not wipe database if it does not exists by @driesvints in https://github.com/laravel/framework/pull/50838
- [11.x] Better database creation failure handling by @driesvints in https://github.com/laravel/framework/pull/50836
- [11.x] Use Default Schema Name on SQL Server by @hafezdivandari in https://github.com/laravel/framework/pull/50855
- Correct typing for startedAs and virtualAs database column definitions by @ollieread in https://github.com/laravel/framework/pull/50851
- Allow passing query Expression as column in Many-to-Many relationship by @plumthedev in https://github.com/laravel/framework/pull/50849
- [11.x] Fix
Middleware::trustHosts(subdomains: true)
by @axlon in https://github.com/laravel/framework/pull/50877 - [11.x] Modify doc blocks for getGateArguments by @saMahmoudzadeh in https://github.com/laravel/framework/pull/50874
- [11.x] Add
[@throws](https://github.com/throws)
to doc block for resolve method by @saMahmoudzadeh in https://github.com/laravel/framework/pull/50873 - [11.x] Str trim methods by @patrickomeara in https://github.com/laravel/framework/pull/50822
- [11.x] Add fluent helper by @PhiloNL in https://github.com/laravel/framework/pull/50848
- [11.x] Add a new helper for context by @michaelnabil230 in https://github.com/laravel/framework/pull/50878
- [11.x]
assertChain
andassertNoChain
on job instance by @gdebrauwer in https://github.com/laravel/framework/pull/50858 - [11.x] Remove redundant
getDefaultNamespace
method in some classes (class, interface and trait commands) by @saMahmoudzadeh in https://github.com/laravel/framework/pull/50880 - [11.x] Remove redundant implementation of ConnectorInterface in MariaDbConnector by @saMahmoudzadeh in https://github.com/laravel/framework/pull/50881
- [11.X] Fix: error when using
orderByRaw
in query before usingcursorPaginate
by @ngunyimacharia in https://github.com/laravel/framework/pull/50887