Код: Выделить всё
[
[
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'johndoe@example.com',
'country_id' => 1,
'phone' => '1112222222',
'isAdmin' => true,
'password' => Hash::make(Str::password(32, true, true, true, false))
],
[
'first_name' => 'Bob',
'last_name' => 'Carlo',
'email' => 'bobcarlo@example.com',
'country_id' => 1,
'phone' => '111111111',
'isAdmin' => true,
'password' => Hash::make(Str::password(32, true, true, true, false)),
'email_send_at' => null,
'phone_send_at' => null
],
];
Во-первых, вот маршруты api.php:
Код: Выделить всё
// User Routes - Start
Route::prefix('user')->group(function ()
Route::group([
"middleware" => ["auth:api"]
], function () {
Route::post('/', [UserController::class, 'store'])->middleware('can:publish user');
Route::put('/{user}', [UserController::class, 'update'])->middleware('can:update user');
Route::delete('/{user}', [UserController::class, 'destroy'])->middleware('can:destroy user');
Route::delete('/', [UserController::class, 'destroyMultiple'])->middleware('can:destroy user');
});
Route::group([
"middleware" => ["client"]
], function () {
Route::get('/', [UserController::class, 'index']);
Route::get('/{user}', [UserController::class, 'show']);
});
});
// User Routes - End
Код: Выделить всё
class User extends Authenticatable
{
use HasFactory, Notifiable, HasRoles, HasApiTokens;
protected static function boot()
{
parent::boot();
static::addGlobalScope(new FilterBy('App\Services\V1\User\UserFilters', request()->all()));
}
//......
Код: Выделить всё
class FilterBy implements Scope
{
protected $namespace;
protected $filters;
public function __construct($namespace, $filters)
{
$this->namespace = $namespace;
$this->filters = $filters;
}
/**
* Apply the scope to a given Eloquent query builder.
*/
public function apply(Builder $builder, Model $model): void
{
if (request()->method() !== 'GET' || empty($this->filters)) {
return;
}
$filter = new FilterBuilder($builder, $this->filters, $this->namespace);
$builder = $filter->apply();
}
}
Код: Выделить всё
class FilterBy implements Scope
{
protected $namespace;
protected $filters;
public function __construct($namespace, $filters)
{
$this->namespace = $namespace;
$this->filters = $filters;
}
/**
* Apply the scope to a given Eloquent query builder.
*/
public function apply(Builder $builder, Model $model): void
{
if (request()->method() !== 'GET' || empty($this->filters)) {
return;
}
$filter = new FilterBuilder($builder, $this->filters, $this->namespace);
$builder = $filter->apply();
}
}
Код: Выделить всё
class FullName extends QueryFilter implements FilterContract
{
protected $query;
public function __construct($query)
{
$this->query = $query;
}
public function handle($value = ""): void
{
$this->query->where(DB::raw("CONCAT(first_name, ' ', last_name)"), 'ilike', '%' . $value . '%');
}
}
Код: Выделить всё
public function index(Request $request)
{
return new UserCollection(User::paginate($request->get('perPage', 15)));
}
Код: Выделить всё
class UserCollection extends ResourceCollection
{
public function __construct($resource)
{
parent::__construct($resource);
$this->preserveAllQueryParameters = true;
}
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}
Код: Выделить всё
class UserResource extends JsonResource
{
public function toArray(Request $request): array
{
if (Auth::check() && Auth::user()->isAdmin && Auth::user()->can('show user')) {
return [
'id' => $this->id,
'first_name' => $this->first_name,
'last_name' => $this->last_name,
'email' => $this->email,
'country_id' => $this->country_id,
'phone' => $this->phone,
'isAdmin' => $this->isAdmin,
];
}
return [
'first_name' => $this->first_name,
'last_name' => $this->last_name,
'country_id' => $this->country_id,
];
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... er-request