Контроллер
В данном руководстве будет описано, как создать собственный контроллер и соответствующий роутер. Это позволит вам расширить функциональность вашего проекта и интегрировать бизнес-логику в REST API.
Структура директорий
Все контроллеры и роутеры для вашего проекта нужно создавать в следующих директориях:
Создание контроллера
Создать директорию /local/bik.rest/controllers/.
Создать новый PHP-файл с именем, отражающим назначение вашего контроллера (например, CustomController.php
).
Откройте созданный файл и определите класс контроллера, который должен наследовать от AbstractController
.
Создайте свой первый контроллер, основываясь на приведенном ниже примере.
Пример контроллера
<?php
namespace BIK\Rest\Controllers;
use BIK\Rest\ORM\Resource\BasketResource;
use BIK\Rest\ORM\Resource\OrderResource;
use Bitrix\Main\Loader;
use Bitrix\Sale\Order;
use Bitrix\Main\ORM\Query\Query;
use Bitrix\Sale\Internals\OrderTable;
use Bitrix\Sale\Internals\BasketTable;
use Bitrix\Sale\Internals\OrderPropsValueTable;
use Bitrix\Sale\Delivery\Services\Manager;
use Bitrix\Iblock\ElementTable;
class CustomController extends AbstractController
{
/*
* Описание эндпоинтов для Swagger
*
* Данный метод может быть переопределён из класса AbstractController при необходимости
*/
protected static function methodDocMap (): array
{
return [
'post_cancel_order' => [
'summary' => 'Отмена заказа',
'description' => 'Отмена заказа по ID для текущего пользователя',
],
'get_order' => [
'summary' => 'Получение заказа',
'description' => 'Получение заказа по ID для текущего пользователя'
],
];
}
/*
* Описание параметров конкретного эндпоинта для Swagger
*
* Данный метод может быть переопределён из класса AbstractController при необходимости
*/
protected static function parametersDocMap ()
{
$return = parent::parametersDocMap();
$return['post_cancel_order'] = [
'orderID' => [
"name" => "orderID",
"in" => "requestBody",
"type" => "int",
"required" => true,
"schema" => [
"type" => "object",
],
"default" => []
]
];
return $return;
}
/*
* Пример эндпоинта для POST запроса
* В этом случае запрос должен осуществляться по адресу {домен}/api/custom/cancel/order
*
* $this->responseData используется, чтобы указать ответ от эндпоинта, необязательный
* $this->responseCode используется, чтобы указать HTTP код ответа, по умолчанию - 200, необязательный
*/
public function post_cancel_order($orderID)
{
Loader::includeModule("sale");
global $USER;
$order = Order::load($orderID);
if ($order->getUserId() == $USER->getId()) {
$oldOrderObject = new \CSaleOrder();
$oldOrderObject->CancelOrder($order->getId(), "Y", 'Отменено пользователем');
$order->setField("STATUS_ID","C");
$result = $order->save();
if($result->isSuccess()) {
$this->responseData['success'] = 'Заказ успешно отменен';
} else {
$this->responseData['error'] = 'При отмене произошла ошибка';
$this->responseCode = 400;
}
} else {
$this->responseData['error'] = 'Это заказ не текущего пользователя';
$this->responseCode = 400;
}
}
/*
* Пример эндпоинта для DELETE запроса
* В этом случае запрос должен осуществляться по адресу {домен}/api/custom/example
*/
public function delete_example()
{
$this->responseData['data'] = 'DELETE request';
}
/*
* Пример эндпоинта для PUT запроса
* В этом случае запрос должен осуществляться по адресу {домен}/api/custom/example
*/
public function put_example()
{
$this->responseData['data'] = 'PUT request';
}
/*
* Пример эндпоинта для GET запроса
* В этом случае запрос должен осуществляться по адресу {домен}/api/custom/order
*/
public function get_order($orderID)
{
Loader::includeModule("sale");
global $USER;
if ($USER->IsAuthorized()) {
$order = Order::load($orderID);
if ($order)
$this->responseData['data'] = [
'id' => $order->getId(),
'price' => $order->getPrice(),
'paid_sum' => $order->getSumPaid(),
'is_paid' => $order->isPaid()
];
else
$this->responseData['error'] = 'Заказ не найден';
}
}
}
Роутер
Каждый контроллер должен иметь свой роутер. Это необходимо для корректной маршрутизации HTTP-запросов на ваши контроллеры.
Создание роутера
Перейдите в папку /local/bik.rest/routers/
.
Создайте новый PHP-файл для роутера (например, CustomRouter.php
).
Определите класс роутера, который должен наследовать от AbstractRouter
.
Создайте роутер, основываясь на приведенном ниже примере.
Пример роутера
<?php
namespace BIK\Rest\Routers;
class CustomRouter extends AbstractRouter
{
public static $name = 'Custom'; # Название роутера в Swagger
public static $description = 'Описание'; # Описание роутера в Swagger
public function run()
{
}
}
Last modified: 19 июня 2025