Как спроектируешь endpoint на Laravel для получения данных пользователя

«Как спроектируешь endpoint на Laravel для получения данных пользователя» — вопрос из категории Laravel, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я бы спроектировал RESTful endpoint GET /api/users/{id} следующим образом:

  1. Маршрут (Route): Регистрирую в routes/api.php с применением middleware для аутентификации (например, Sanctum) и валидации параметров.

    use AppHttpControllersApiUserController;
    Route::get('/users/{user}', [UserController::class, 'show'])
        ->middleware('auth:sanctum')
        ->name('users.show');
  2. Контроллер (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);
        }
    }
  3. Ресурс (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.