Clase de Alcance
Al crear componentes CRUD, es posible que tengas clases basadas en la misma tabla. Por lo tanto, querrás aplicar un alcance (scope) personalizado a cada componente para filtrar cómo se recuperan los registros.
Un buen ejemplo es un blog con PostCrud y MyPostCrud. Ambas clases usan la misma tabla, pero MyPostCrud debe mostrar las publicaciones creadas por el usuario que ha iniciado sesión. Ahí es donde entran en juego las clases de Scope.
Declaración de Alcance
En tu módulo, el alcance (scope) debe almacenarse en el directorio «Scopes». Aunque esto no es un requisito, recomendamos encarecidamente este enfoque. La definición de un alcance sigue la misma estructura que un scope regular de Laravel. Aquí tienes un ejemplo de cómo se declaran los alcances:
<?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() );
}
}
Usando ámbitos en clases
Ahora que hemos definido nuestro alcance, podemos aplicarlo a cualquier clase CRUD que queramos. Así es como debemos proceder:
<?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
}