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

acquaintsoft logo
Acquaint Softtech

Hire Laravel developers with AI expertise at $20/hr. Get started in 48 hours.

Visit Acquaint Softtech

The latest

View all →
Laravel Read Replicas: Check if a Replica Has Caught Up image

Laravel Read Replicas: Check if a Replica Has Caught Up

Read article
UUID Request Input and Migration Failure Events in Laravel 13.42 image

UUID Request Input and Migration Failure Events in Laravel 13.42

Read article
Replay Missed Laravel Scheduled Tasks With Schedule Catchup image

Replay Missed Laravel Scheduled Tasks With Schedule Catchup

Read article
Search Polymorphic Relations and Filament Tables With Laravel Searchable image

Search Polymorphic Relations and Filament Tables With Laravel Searchable

Read article
Laravel Rest Api 3.0: Typed Fields, Metrics, and OpenAPI Docs image

Laravel Rest Api 3.0: Typed Fields, Metrics, and OpenAPI Docs

Read article
Real-Time Inertia Props With Laravel Reverb image

Real-Time Inertia Props With Laravel Reverb

Read article