Never Miss a Laravel Release 🚀
The Laravel team released v12.16.0, with a fluent Rule::contains() validation rule, an in_array_keys validation rule, a new Arr::hasAll() method, and more:
in_array_keys Validaiton Rule
Steve Bauman contributed an in_array_keys validation rule that validates whether an array contains at least one of the specified keys:
$validator = Validator::make($request->all(), [ 'config' => 'array|in_array_keys:api_key,access_token,oauth_token', 'config.api_key' => 'nullable|string|min:32|max:64', 'config.access_token' => 'nullable|string|min:40', 'config.oauth_token' => 'nullable|string|starts_with:oauth_',]);
According to the Pull Request, this rule's purpose is to validate that an array has any of a given set of keys, as there is no built-in way to accomplish this without a custom rule:
While the required_array_keys rule exists which ensures all specified keys exist in an array, there is no built-in way to validate that an array has at least one of a given set of keys.
Interact with Hidden Context in the Context Attribute
@devajmeireles contributed the ability to use a hidden context attribute by passing a second hidden boolean argument. The Context attribute was added in Laravel 12.15, which allows you to inject a context value:
public function __construct(#[Context('user', hidden: true)] User $user)
See Pull Request #55799 for details.
Add Rule contains() Fluent Method
Steve Bauman contributed a contains() method to the Rule class, which compliments the string contains version of this rule:
use Illuminate\Validation\Rule; // BeforeValidator::make($request->all(), [ 'roles' => [ 'required', 'array', 'contains:'.implode(',', array_column([Role::Admin, Role::Editor], 'value')), ],]); // AfterValidator::make($request->all(), [ 'roles' => [ 'required', 'array', Rule::contains([Role::Admin, Role::Editor]), ],]);
The validation documentation has been updated with an example of using the fluent version of the rule.
Arr hasAll() Method
@devajmeireles contributed a hasAll() method to the Arr support helper:
use Illuminate\Support\Arr; $array = ['name' => 'Taylor', 'language' => 'php']; Arr::hasAll($array, ['name']); // trueArr::hasAll($array, ['name', 'language']); // trueArr::hasAll($array, ['name', 'ide']); // false
Stringable toUri() Method
@devajmeireles contributed a toUri() method that can convert a string into a URI instance:
$sentence = 'Go to {https://euhosting.com/support} for support.'; $uri = str($sentence)->between('{', '}')->toUri(); if (auth()->user()->isVip()) { $uri = $uri->withQuery(['customer' => auth()->user()->publicId()]) ->withQuery(['priority' => 'emergency']);} return $uri->value();
Release notes
You can see the complete list of new features and updates below and the diff between 12.15.0 and 12.16.0 on GitHub. The following release notes are directly from the changelog:
v12.16.0
- [12.x] Change priority in optimize:clear by @amirmohammadnajmi in https://github.com/laravel/framework/pull/55792
- [12.x] Fix
TestResponse::assertSessionMissing()when given an array of keys by @crynobone in https://github.com/laravel/framework/pull/55800 - [12.x] Allowing
ContextAttribute to Interact with Hidden by @devajmeireles in https://github.com/laravel/framework/pull/55799 - Add support for sending raw (non-encoded) attachments in Resend mail driver by @Roywcm in https://github.com/laravel/framework/pull/55803
- [12.x] Added option to always defer for flexible cache by @Zwartpet in https://github.com/laravel/framework/pull/55802
- [12.x] style: Use null coalescing assignment (??=) for cleaner code by @mohsenetm in https://github.com/laravel/framework/pull/55823
- [12.x] Introducing
Arr::hasAllby @devajmeireles in https://github.com/laravel/framework/pull/55815 - [12.x] Restore lazy loading check by @decadence in https://github.com/laravel/framework/pull/55817
- [12.x] Minor language update by @AhmedAlaa4611 in https://github.com/laravel/framework/pull/55812
- fix(cache/redis): use connectionAwareSerialize in RedisStore::putMany() by @superbiche in https://github.com/laravel/framework/pull/55814
- [12.x] Fix
ResponseFactoryshould also acceptnullcallback by @crynobone in https://github.com/laravel/framework/pull/55833 - [12.x] Add template variables to scope by @wietsewarendorff in https://github.com/laravel/framework/pull/55830
- [12.x] Introducing
toUrito theStringableClass by @devajmeireles in https://github.com/laravel/framework/pull/55862 - [12.x] Remove remaining @return tags from constructors by @AhmedAlaa4611 in https://github.com/laravel/framework/pull/55858
- [12.x] Replace alias
is_integer()withis_int()to comply with Laravel Pint by @xurshudyan in https://github.com/laravel/framework/pull/55851 - Fix argument types for Illuminate/Database/Query/Builder::upsert() by @jellisii in https://github.com/laravel/framework/pull/55849
- [12.x] Add
in_array_keysvalidation rule to check for presence of specified array keys by @stevebauman in https://github.com/laravel/framework/pull/55807 - [12.x] Add
Rule::containsby @stevebauman in https://github.com/laravel/framework/pull/55809