A tiny macro that reuse a global scope class as a local scope
mpyw/laravel-local-class-scope is a Laravel package for a tiny macro that reuse a global scope class as a local scope.
It currently has 24 GitHub stars and 111.283 downloads on Packagist (latest version v2.3.0).
Install it with composer require mpyw/laravel-local-class-scope.
Discover more Laravel packages by mpyw
or browse all Laravel packages to compare alternatives.
Last updated
A tiny macro that reuse a global scope class as a local scope.
The idea is from: [Proposal] Local query scopes as classes · Issue #636 · laravel/ideas
^8.2^11.0 || ^12.0 || ^13.0 || ^14.0[!NOTE] Older versions have outdated dependency requirements. If you cannot prepare the latest environment, please refer to past releases.
composer require mpyw/laravel-local-class-scope
class ActiveScope implements Scope
{
public function apply(Builder $query, Model $model): void
{
$query->where('active', true);
}
}
User::scoped(ActiveScope::class)->get();
User::scoped(new ActiveScope())->get();
class AgeScope implements Scope
{
protected $parameters;
public function __construct(...$parameters)
{
$this->parameters = $parameters;
}
public function apply(Builder $query, Model $model): void
{
$query->where('age', ...$this->parameters);
}
}
User::scoped(AgeScope::class, '>', 18)->get();
User::scoped(new AgeScope('>', 18))->get();
User::scoped(ActiveScope::class)->scoped(AgeScope::class, '>', 18)->get();
class User extends Model
{
public function scopeActive(Builder $query): Builder
{
return $this->scoped(ActiveScope::class);
}
}
trait ScopesActive
{
public function scopeActive(Builder $query): Builder
{
return $this->scoped(ActiveScope::class);
}
}
class User extends Model
{
use ScopesActive;
}
class Admin extends Model
{
use ScopesActive;
}
You can use the PHPStan extension to get better static analysis support for the scoped method.
To enable the extension, you need to include it in the phpstan.neon configuration file as follows:
includes:
- vendor/mpyw/laravel-local-class-scope/extension.neon
- vendor/larastan/larastan/extension.neon
[!IMPORTANT] If you are using Larastan (as is typical), you must include the extension of this package before Larastan's extension.