Accueil
NexoPOS

Classe de périmètre

Lors de la création de composants CRUD, vous pouvez avoir des classes basées sur la même table. Par conséquent, vous souhaitez appliquer une portée (scope) personnalisée à chaque composant afin de filtrer la manière dont les entrées sont récupérées.

Un bon exemple est un blog avec PostCrud et MyPostCrud. Les deux classes utilisent la même table, mais MyPostCrud doit afficher les articles créés par l’utilisateur connecté. C’est là qu’interviennent les classes de portée (Scope Classes).

Déclaration du périmètre

Dans votre module, la portée (scope) doit être stockée dans le répertoire « Scopes ». Bien que ce ne soit pas une obligation, nous vous recommandons vivement d’adopter cette approche. La définition d’une portée suit la même structure qu’une portée Laravel classique. Voici un exemple de la manière dont les portées sont déclarées :


<?php
namespace Modules\MyModule\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Database\Query\Builder;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Support\Facades\Auth;

class MyPost implements Scope
{
    public function apply( Builder | QueryBuilder $builder, Model $model )
    {
        $builder->where( 'author', Auth::id() );
    }
}

Utiliser des portées sur les classes

Maintenant que nous avons défini notre périmètre, nous pouvons l’utiliser sur n’importe quelle classe CRUD à laquelle nous souhaitons l’appliquer. Voici comment procéder :


<?php
namespace Modules\MyModule\Crud;

use App\Services\CrudService;
use App\Classes\CrudScope;
use Modules\MyModules\Scopes\MyPost;

#[ CrudScope( MyPost ) ]
class MyPostCrud extends CrudService
{
    // internal class definition
}