Битрикс — создание собственных контроллеров

Задача создать свой собственный REST используя контроллеры в Битрикс.

Создам ресурс GET bitrix-domain.local/almat/su/user/, который будет возвращать все ФИО всех пользователей.

Также туда можно будет передать фильтрь params, по которому можно будет отфильтровать пользователей. Для создания своих контроллеров понадобится сначала создать каркас собственного модуля. Как это сделать описано здесь:

Создание собственного модуля в Битрикс

По теории о контроллерах в Битрикс можно почитать тут

https://dev.1c-bitrix.ru/learning/course/index.php?LESSON_ID=6436&COURSE_ID=43

Также, чтобы получить красивые урлы нужно будет поменять настройки роутинга.

1 . Изменить в .htaccess, который лежит в корне

2. Изменить в bitrix/.settings.php

3. Добавить в папку local файл

/local/routes/api.php

Весь код можно увидеть по ссылке пример контроллера в Битрикс

Скачайте его на свой сервер, обратите внимание на папку controller, где создан сам контроллер. Также обратите внимание на папку include, где происходит добавление нового пространства имен Almat\Su\Controller

Теперь при отправке по адресу

мы видим… требование авторизации. По умолчанию, битрикс требует авторизацию для кастомных роутов.
Авторизуемся по Basic Auth. Новый запрос выглядет теперь так:
Этот пример можно импортировать в Postman
Логин и пароль вводите от существуюшего пользователя.
получите ошибку

Тут есть два выхода

  1. Передать csrf в параметре sessid

2. Отключить проверку csrf

переопределив метод getDefaultPreFilters, удалив проверку Csrf

Теперь при обращении по этому роуту возвращаются данные:

пример контроллера в Битрикс24
пример контроллера в Битрикс

Как фильтровать данные?

Для фильтрации данных нужно передать params c нужным фильтром, например, выбор пользователя с ID = 1 будет выглядеть так

который вернет

2 комментария

  1. Михаил
    ·

    Отличная статья. спасибо автору.

    Ответить

  2. ·

    Удаление проверки CSRF для метода POST не работает также, как для метода GET, поэтому лучше его определить, но передать в параметрах false, так проверка использования csrf работать не будет и ошибки выдавать не будет.

    public function getDefaultPreFilters(): array
    {
    return [
    new CustomActionFilter\SimpleToken(),
    new ActionFilter\HttpMethod(
    [ActionFilter\HttpMethod::METHOD_GET, ActionFilter\HttpMethod::METHOD_POST]
    ),
    new ActionFilter\Csrf(false),
    ];
    }

    Ответить

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *