Ответ
Я бы спроектировал RESTful endpoint GET /api/users/{id} следующим образом:
-
Маршрут (Route): Регистрирую в
routes/api.phpс применением middleware для аутентификации (например, Sanctum) и валидации параметров.use AppHttpControllersApiUserController; Route::get('/users/{user}', [UserController::class, 'show']) ->middleware('auth:sanctum') ->name('users.show'); -
Контроллер (Controller): Использую implicit route model binding и возвращаю данные через Resource.
namespace AppHttpControllersApi; use AppHttpResourcesUserResource; use AppModelsUser; class UserController extends Controller { public function show(User $user) { // Авторизация: проверяем, может ли текущий пользователь просматривать этот профиль $this->authorize('view', $user); return new UserResource($user); } } -
Ресурс (Resource): Форматирую ответ, контролируя, какие поля видны.
namespace AppHttpResources; use IlluminateHttpResourcesJsonJsonResource; class UserResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->when($request->user()->can('viewEmail', $this), $this->email), 'created_at' => $this->created_at->toIso8601String(), '_links' => [ // HATEOAS-стиль 'self' => route('users.show', $this), ] ]; } }
Ключевые принципы: Использование встроенных возможностей Laravel (binding, policies, resources) для безопасности, чистоты кода и стандартизации ответов API.