Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 611новых вакансий за сутки·93 573вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 282
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python16 842
  • Облачные технологии13 740
  • QA вакансии3 442
  • Backend вакансии2 083
  • Инженер данных1 769
  • Продакт-менеджер1 215

Разработка

  • Android1 842
  • iOS1 687
  • Fullstack вакансии958
  • AI вакансии949
  • Frontend вакансии735
  • Mobile вакансии44

По стеку

  • Go8 619
  • Java6 377
  • Node.js1 968
  • .NET1 639
  • Kotlin1 597
  • Rust1 444
  • PHP670
  • C#650
  • C++538

DevOps и инфраструктура

  • Kubernetes7 596
  • DevOps вакансии5 863
  • Linux-инфраструктура5 418
  • Terraform / IaC4 165
  • CI/CD2 997
  • Мониторинг и Observability1 759
  • SRE564
  • Кибербезопасность430

Аналитика и данные

  • Data Scientist1 093
  • Бизнес-аналитик914
  • Аналитик данных851
  • Системный аналитик150

Другие направления

  • Проджект-менеджер570
  • UI/UX дизайн144
  • Ручное тестирование14

По регионам

  • Вакансии в США45 355
  • Вакансии в Европе23 707
  • Вакансии в Канаде4 483
  • Работа в России3 902

По формату

  • Удалённые вакансии75 369
  • Релокация в США45 353
  • Гибридная работа12 002
  • Офисная работа7 033

По уровню

  • Senior вакансии42 326
  • Middle вакансии20 996
  • Junior вакансии6 757

Сейчас нанимают

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab139 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме LaravelВсе вопросы
LaravelMiddleКодинг

Как реализовать API resources в Laravel для трансформации моделей?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

API Resource в Laravel — класс, трансформирующий Eloquent-модель в JSON через метод toArray(). Используйте whenLoaded() для безопасной сериализации связей без N+1 запросов.

Базовый Resource

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray(Request $request): array
    {
        return [
            'id'         => $this->id,
            'name'       => $this->name,
            'email'      => $this->email,
            'role'       => $this->whenLoaded('role', fn() => $this->role->name),
            'created_at' => $this->created_at->toIso8601String(),
        ];
    }
}

В контроллере достаточно вернуть new UserResource($user) или UserResource::collection($users) — Laravel автоматически устанавливает заголовок Content-Type: application/json и статус 200.

API Resources в Laravel

API Resource — это слой трансформации между Eloquent-моделью и JSON-ответом. Вместо того чтобы сериализовать модель напрямую (что раскрывает все поля БД), вы явно описываете, какие данные и в каком формате уйдут клиенту. Создаётся командой php artisan make:resource UserResource.

Resource Collection с метаданными

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\ResourceCollection;

class UserCollection extends ResourceCollection
{
    public $collects = UserResource::class;

    public function toArray(Request $request): array
    {
        return [
            'data' => $this->collection,
            'meta' => [
                'total'   => $this->total(),
                'version' => 'v2',
            ],
        ];
    }
}

Условные поля и вложенные ресурсы

public function toArray(Request $request): array
{
    return [
        'id'      => $this->id,
        'secret'  => $this->when($request->user()?->isAdmin(), $this->secret_key),
        'posts'   => PostResource::collection($this->whenLoaded('posts')),
        'company' => new CompanyResource($this->whenLoaded('company')),
    ];
}

Метод whenLoaded() критически важен: если связь не была eager-loaded, поле просто исключается из ответа, а не провоцирует N+1 запрос. Метод when() позволяет включать поля только при выполнении условия — например, для admin-only полей.

Добавление заголовков и обёртки

// Убрать обёртку 'data' глобально:
JsonResource::withoutWrapping();

// Или добавить кастомный заголовок для конкретного ресурса:
public function withResponse(Request $request, $response): void
{
    $response->header('X-Resource-Version', '2.0');
}

Подводные камни

  • Вызов $this->resource->relation без whenLoaded() вызывает скрытый N+1 — Eloquent загрузит связь лениво для каждого элемента коллекции.
  • JsonResource::withoutWrapping() — глобальная настройка; если вызвать её в одном ресурсе, она снимает обёртку у всех ресурсов в том же запросе.
  • При использовании UserResource::collection($paginator) пагинационные ссылки (links, meta) добавляются автоматически — но только если передан объект Paginator, а не обычная коллекция.
  • Поле $this->when(false, ...) полностью удаляется из JSON, а не превращается в null — это нарушает контракт API, если клиент ожидает поле всегда.
  • Resource не валидирует входные данные и не защищает от утечки полей через $this->resource — разработчик вручную контролирует whitelist полей в toArray().
  • Нельзя кэшировать Resource-объект между запросами: он привязан к $request и содержит ссылку на модель.
  • При сериализации Carbon-дат без явного вызова (->toIso8601String() или ->format()) формат определяется глобальной настройкой Carbon::serializeUsing(), что может дать неожиданный результат в разных окружениях.

Частые вопросы на собеседовании

  • Как работает система маршрутизации (routing) в Laravel и в чём разница между web и API маршрутами?
  • Что такое migrations в Laravel и как их создавать и запускать?
  • Что такое паттерн MVC и как Laravel его реализует?
  • Что такое Laravel и каковы его ключевые возможности?

Типичные ошибки

  • Сводить api resources к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Laravel 13 поверх PHP: request проходит через HTTP kernel, middleware, routing, controller/action и response pipeline.
  • Не отделять validation, authorization, transaction boundary и business logic.

Что проверяет интервьюер

  • Объясняет api resources через конкретную точку lifecycle в Laravel.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

Как вы знаете этот вопрос?

Проверить себя по теме Laravel →

Источники

  • https://laravel.com/docs/13.x/eloquent-resources
  • https://laravel.com/docs/13.x

Связанные темы

LaravelBackend-Engineeringlaravel-ecosystem