Skip to content
Back to skills

Bitrix Controllers

ASecurity

Покрывает контроллеры D7 на базе Bitrix\Main\Engine\Controller и JsonController — actions, автосвязывание параметров, фильтры ActionFilter (Authentication, Csrf, HttpMethod, Scope, CloseSession, ContentType), ошибки через addError/ErrorCollection, configureActions, рендер и JSON-ответы. Применяется при реализации AJAX/REST-эндпоинтов, внутренних API и ajax-экшенов компонентов через Controllerable. Ключевые термины — Controller, action, ActionFilter, Csrf, runAction, addError, configureActions...

  • 4 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 12, 2026
developmentphpreactapi

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 12, 2026

npx -y skills add aibot88/sec_skill_store --skill bitrix-controllers --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Bitrix Controllers?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Bitrix Controllers
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aibot88-bitrix-controllers/badge)](https://www.skillsdirectory.com/skills/aibot88-bitrix-controllers)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: bitrix-controllers
description: Покрывает контроллеры D7 на базе Bitrix\Main\Engine\Controller и JsonController — actions, автосвязывание параметров, фильтры ActionFilter (Authentication, Csrf, HttpMethod, Scope, CloseSession, ContentType), ошибки через addError/ErrorCollection, configureActions, рендер и JSON-ответы. Применяется при реализации AJAX/REST-эндпоинтов, внутренних API и ajax-экшенов компонентов через Controllerable. Ключевые термины — Controller, action, ActionFilter, Csrf, runAction, addError, configureActions, ajax endpoint, REST.
---

# Контроллеры Bitrix

## Где лежат и как называются

- Файлы: `/local/modules/<vendor>.<module>/lib/Infrastructure/Controller/<Name>.php`.
- Неймспейс (по умолчанию): `\Vendor\Module\Infrastructure\Controller\<Name>`.
- Публичный URL для AJAX: `/bitrix/services/main/ajax.php?action=vendor:module.<name>.<action>`.
- URL можно переписать маршрутом (см. `bitrix-routing`).

Настройка пространства имён — в `/local/modules/vendor.module/.settings.php`:

```php
'controllers' => [
    'value' => [
        'defaultNamespace' => '\\Vendor\\Module\\Infrastructure\\Controller',
        'namespaces' => [
            '\\Vendor\\Module\\Infrastructure\\Controller\\Web' => 'web',
        ],
        'restIntegration' => ['enabled' => true], // для REST
    ],
    'readonly' => true,
],
```

Доступ к `Web\PostController::getAction` → `?action=vendor:module.web.post.get`.

## Минимальный контроллер

```php
<?php declare(strict_types=1);

namespace Vendor\Module\Infrastructure\Controller;

use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\ActionFilter;
use Bitrix\Main\Error;
use Vendor\Module\Application\Service\PostService;

final class Post extends Controller
{
    public function __construct(
        private readonly PostService $postService,
    ) {
        parent::__construct();
    }

    public function configureActions(): array
    {
        return [
            'get' => [
                '+prefilters' => [new ActionFilter\HttpMethod([ActionFilter\HttpMethod::METHOD_GET])],
                '-prefilters' => [ActionFilter\Csrf::class], // GET без CSRF
            ],
            'create' => [
                '+prefilters' => [
                    new ActionFilter\HttpMethod([ActionFilter\HttpMethod::METHOD_POST]),
                    new ActionFilter\Authentication(),
                ],
            ],
        ];
    }

    public function getAction(int $id): array
    {
        $post = $this->postService->find($id);
        if ($post === null)
        {
            $this->addError(new Error('Not found', 'POST_NOT_FOUND'));
            return [];
        }

        return ['post' => $post];
    }

    public function createAction(string $title, string $body): array
    {
        $result = $this->postService->create($title, $body);

        if (!$result->isSuccess())
        {
            $this->addErrors($result->getErrors());
            return [];
        }

        return ['id' => $result->getId()];
    }
}
```

## Автосвязывание параметров действий

Параметры действия собираются движком в следующем порядке:

1. **Скалярные типы** (`int`, `string`, `bool`, `float`, `array`) → из `GET`/`POST`/`FILES`.
2. **Объекты-сервисы** → из `ServiceLocator` по имени/типу.
3. **`HttpRequest`, `Session`, `CurrentUser`** → из контекста.
4. **Request DTO** с атрибутом `#[Bitrix\Main\Validation\Engine\ValidationParameter]` → маппинг из запроса + валидация (см. `bitrix-validation`).
5. **ORM-объекты**, если действие принимает `EntityObject` — загружаются по `id`.

Отсутствие обязательного параметра → автоматическая ошибка.

## Фильтры действий

Предустановленные:

- `ActionFilter\Authentication` — требует авторизованного пользователя.
- `ActionFilter\Csrf` (по умолчанию включён на `POST`) — проверка `sessid`/`X-Bitrix-Csrf-Token`.
- `ActionFilter\HttpMethod([...])` — ограничение по методу.
- `ActionFilter\CloseSession` — закрывает сессию перед действием (параллельные AJAX).
- `ActionFilter\ContentType(['application/json'])` — допустимый `Content-Type`.
- `ActionFilter\Scope($scope)` — ограничивает вызов конкретным scope (ajax/rest/cli).

Формат в `configureActions()`:

```php
'default' => [
    'prefilters' => [...],   // полностью заменить список
    '+prefilters' => [...],  // добавить
    '-prefilters' => [...],  // удалить (по FQCN)
    'postfilters' => [...],
],
```

## Ошибки

- `$this->addError(new \Bitrix\Main\Error('msg', 'CODE', ['key' => 'value']));`
- `$this->addErrors($result->getErrors());`
- Никогда не бросай исключения наружу ради «обычных» пользовательских ошибок — они ухудшают UX и сложнее тестируются. Используй `Result` + `Error`.
- Ответ с ошибками автоматически получает `status: 'error'` и массив `errors`.

## Типы ответов

- `array` → JSON: `{ "status": "success", "data": [...] }`.
- `null` → `{ "status": "success" }` без данных.
- `Bitrix\Main\HttpResponse` — кастомный ответ (заголовки, статус, тело).
- `Bitrix\Main\Engine\Response\Html` / `Json` / `Redirect` / `AjaxJson`.
- `Bitrix\Main\Engine\Response\Component` — рендер компонента.
- `Bitrix\Main\Engine\Response\Component\Ajax` — JSON + рендер компонента.
- `Bitrix\Main\Engine\Response\BFile` / `File` / `HttpResponseFile` — отдача файла.

Помощники контроллера:

```php
return $this->renderView('list', ['items' => $items]);
// => /local/modules/vendor.module/views/list.php

return $this->renderComponent('vendor:post.list', '.default', ['IBLOCK_ID' => 12]);

return $this->renderExtension('vendor.post.list', ['items' => $items]);
```

## Scope (AJAX / REST / CLI)

- **AJAX**: вызов через `/bitrix/services/main/ajax.php?action=...` или `BX.ajax.runAction('...', {})` из JS. Автоматически доступен если контроллер объявлен и есть `controllers` в `.settings.php`.
- **REST**: требуется `restIntegration.enabled = true` в настройках + установленный модуль `rest`.
- **CLI**: контроллер можно вызвать из команды, если есть `ActionFilter\Scope`.

Разные сценарии — разные наборы фильтров. Пример переопределения по scope:

```php
public function configureActions(): array
{
    return [
        'get' => [
            'prefilters' => [
                new ActionFilter\Scope(ActionFilter\Scope::AJAX),
                new ActionFilter\HttpMethod([ActionFilter\HttpMethod::METHOD_GET]),
            ],
        ],
    ];
}
```

## Вызов с фронта

```js
BX.ajax.runAction('vendor:module.post.create', {
    data: { title: 'Title', body: 'Body' },
}).then((response) => {
    console.log(response.data);
});
```

Для REST — `BX.rest.callMethod('vendor.module.post.create', {...})`.

## Чек-лист

- [ ] Контроллер **тонкий**: вызывает сервис, возвращает DTO/массив.
- [ ] Указаны `HttpMethod` и `Authentication`/`Csrf` там, где нужно.
- [ ] Вход валидируется через Request DTO + `#[ValidationParameter]` (см. `bitrix-validation`).
- [ ] Ошибки возвращаются через `$this->addError(...)`, а не через исключения.
- [ ] Возвращаемый тип явный: `array`, `HttpResponse` или `renderXxx`.
- [ ] Зависимости инжектятся через конструктор; сервисы зарегистрированы в `ServiceLocator`.

Files in this skill

  • SKILL.md8.4 KB
  • source.json1.2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.