News

With Laravel 10.44 you can add Model Scopes and Observers using PHP Attributes

Published Updated

Release updates

Never miss a Laravel release

Get an email whenever a new Laravel release lands.

The Laravel team released v10.44 this week with two Eloquent model attributes to define global scopes and observers, a new select() collection method, and more:

New ScopedBy attribute for models

Eliezer Margareten contributed a ScopedBy attribute to register global scopes on your Eloquent models:

use App\Models\Scopes\AncientScope;
use Illuminate\Database\Eloquent\Attributes\ScopedBy;
 
#[ScopedBy([AncientScope::class])]
class User extends Model
{
//
}

You can continue to use the booted() method in a model to register global scopes:

/**
* The "booted" method of the model.
*/
protected static function booted(): void
{
static::addGlobalScope(new AncientScope);
}

The ScopedBy attribute accepts a single observer or an array of observers, and you can also define multiple attributes for your model:

// Array type
#[ScopedBy([ScopeOne::class, ScopeTwo::class])]
 
// Repeatable string type
#[ScopedBy(ScopeOne::class)]
#[ScopedBy(ScopeTwo::class)]

New ObservedBy attribute for models

Eliezer Margareten contributed an ObservedBy attribute to register model observers on your Eloquent models:

use App\Observers\UserObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
 
#[ObservedBy([UserObserver::class])]
class User extends Authenticatable
{
//
}

The ObservedBy attribute accepts a single observer or an array of observers, and you can also define multiple attributes for your model if that’s your style:

// Array of classes
#[ObservedBy([UserObserver::class, AnotherObserver::class])]
 
// Repeatable as string
#[ObservedBy(UserObserver::class)]
#[ObservedBy(AnotherObserver::class)]

The ObservedBy attribute is an additional way to register observers, which is traditionally done in a service provider:

public function boot(): void
{
User::observe(UserObserver::class);
}

The select() Collection method

Craig Morris contributed a new Collection::select() method that selects a certain number of keys from a multi-dimensional array. The select() method is similar to an SQL SELECT statement:

$users = collect([
['name' => 'Taylor Otwell', 'role' => 'Developer', 'status' => 'active'],
['name' => 'Victoria Faith', 'role' => 'Researcher', 'status' => 'active'],
]);
 
$users->select(['name', 'role']);
 
/*
[
['name' => 'Taylor Otwell', 'role' => 'Developer'],
['name' => 'Victoria Faith', 'role' => 'Researcher'],
],
*/

Base64 String Methods

Mark Townsend contributed toBase64() and fromBase64() to Str and Stringable. These methods wrap base64_encode() and base64_decode() respectively:

// Using Str
$encoded = Str::toBase64('laravel-news.com');
$decoded = Str::fromBase64($encoded);
 
// Using Stringable
$encoded = str('laravel-news.com')->toBase64();
$decoded = str($encoded)->fromBase64();

Here’s some example output from a tinker session:

New Arr::take() Method

Ryan Chandler contributed a Arr::take() method to take a certain number of items from an array. It will take from the front of the array with positive numbers and from the end of the array given a negative number:

$data = [1, 2, 3, 4, 5, 6, 7, 8, 9];
 
Arr::take($data, 3); // [1, 2, 3]
Arr::take($data, -3); // [7, 8, 9]
Arr::take($data, 0); // []
Arr::take($data, 1); // [1]
Arr::take($data, -1); // [9]

Release notes

You can see the complete list of new features and updates below and the diff between 10.43.0 and 10.44.0 on GitHub. The following release notes are directly from the changelog:

v10.44.0

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Sponsored

masteringlaravel logo
Laravel Code Review

Get expert guidance in a few days with a Laravel code review

Visit Laravel Code Review

The latest

View all →
Laravel monitoring that doesn't bill you by your traffic image

Laravel monitoring that doesn't bill you by your traffic

Read article
Mock PHP Classes in Tests With the Double Library image

Mock PHP Classes in Tests With the Double Library

Read article
Laravel Discount: Coupon Codes, Usage Limits, and Stacking image

Laravel Discount: Coupon Codes, Usage Limits, and Stacking

Read article
Laravel Truss: Live Interactive Database ER Diagrams image

Laravel Truss: Live Interactive Database ER Diagrams

Read article
Laravel artisan dev: Run Server, Queue, Logs, and Vite image

Laravel artisan dev: Run Server, Queue, Logs, and Vite

Read article
Validate and Convert HEIC Images in Laravel image

Validate and Convert HEIC Images in Laravel

Read article