Разработка кастомных контроллеров Strapi

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка кастомных контроллеров Strapi
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Кастомные контроллеры в Strapi

Контроллер в Strapi — класс, обрабатывающий HTTP-запрос. По умолчанию каждый content type получает стандартные контроллеры (find, findOne, create, update, delete). Кастомный контроллер переопределяет стандартное поведение или добавляет новые эндпоинты.

Структура контроллера

// src/api/article/controllers/article.ts
import { factories } from '@strapi/strapi'

export default factories.createCoreController('api::article.article', ({ strapi }) => ({
  // Переопределить find — добавить дополнительную логику
  async find(ctx) {
    // Добавить счётчик просмотров к ответу
    const response = await super.find(ctx)

    // Добавить мета-информацию
    response.meta.generatedAt = new Date().toISOString()

    return response
  },

  // Переопределить findOne — увеличить счётчик просмотров
  async findOne(ctx) {
    const response = await super.findOne(ctx)

    if (response.data) {
      const { id } = ctx.params
      // Обновить счётчик асинхронно (не блокировать ответ)
      strapi.entityService.update('api::article.article', id, {
        data: { viewCount: (response.data.attributes.viewCount || 0) + 1 },
      }).catch(console.error)
    }

    return response
  },

  // Кастомное действие
  async publish(ctx) {
    const { id } = ctx.params
    const article = await strapi.entityService.findOne('api::article.article', id)

    if (!article) {
      return ctx.notFound('Article not found')
    }

    if (article.publishedAt) {
      return ctx.badRequest('Article already published')
    }

    const updated = await strapi.entityService.update('api::article.article', id, {
      data: { publishedAt: new Date().toISOString() },
    })

    // Отправить уведомления подписчикам
    await strapi.service('api::newsletter.newsletter').notifySubscribers(updated)

    return this.transformResponse(updated)
  },
}))

Маршрут для кастомного действия

// src/api/article/routes/article.ts
import { factories } from '@strapi/strapi'

export default factories.createCoreRouter('api::article.article', {
  // Добавить кастомный маршрут
  config: {
    find: {},
    findOne: {},
    create: { middlewares: ['api::article.check-quota'] },
    update: {},
    delete: {},
  },
})
// src/api/article/routes/custom-article.ts
export default {
  routes: [
    {
      method: 'POST',
      path: '/articles/:id/publish',
      handler: 'article.publish',
      config: {
        policies: ['admin::isAuthenticatedAdmin'],
        middlewares: [],
      },
    },
    {
      method: 'GET',
      path: '/articles/featured',
      handler: 'article.getFeatured',
      config: { auth: false },
    },
  ],
}

Контроллер с пагинацией и фильтрацией

async getFeatured(ctx) {
  const { category, limit = 6 } = ctx.query

  const filters: any = {
    featured: { $eq: true },
    publishedAt: { $notNull: true },
  }

  if (category) {
    filters.category = { slug: { $eq: category } }
  }

  const articles = await strapi.entityService.findMany('api::article.article', {
    filters,
    populate: ['cover', 'category', 'author'],
    sort: { publishedAt: 'desc' },
    limit: Number(limit),
  })

  return { data: articles }
}

Контроллер с валидацией

async create(ctx) {
  const { title, content, category } = ctx.request.body.data || {}

  // Кастомная валидация
  if (!title || title.length < 5) {
    return ctx.badRequest('Title must be at least 5 characters')
  }

  if (content && content.length > 50000) {
    return ctx.badRequest('Content too long (max 50000 chars)')
  }

  // Проверить уникальность заголовка
  const existing = await strapi.entityService.findMany('api::article.article', {
    filters: { title: { $eq: title } },
    limit: 1,
  })

  if (existing.length > 0) {
    return ctx.conflict('Article with this title already exists')
  }

  // Установить автора автоматически
  ctx.request.body.data.author = ctx.state.user.id

  return super.create(ctx)
}

Сроки

Разработка кастомных контроллеров для 2–3 content types с дополнительными эндпоинтами и валидацией — 2–3 дня.