Контроллеры
Контроллер - это класс с методами или обычный скрипт, который будет отработан при входящем запросе.
Контроллеры указываются в карте роутов при описании роута. По умолчанию, контроллеры располагаются в папке модуля /bitrix/modules/artamonov.rest/lib/controllers/. Но, также контроллер может располагаться за пределами модуля, главное чтобы он был доступен через пространство имён или по указанному пути.
Начиная с версии 2.3.0 можно указать путь к PHP-скрипту, вместо указания неймспейса контроллера.
В качестве примера, можно ознакомиться с нативными контроллерами, расположенными по пути /bitrix/modules/artamonov.rest/lib/controllers/native.
/**
* Copyright (c) 2019 Denis Artamonov
* Created: 1/13/19 5:23 PM
* Author: Denis Artamonov
*
* Пример контроллера
*/
namespace Artamonov\Rest\Controllers\Native;
class Example
{
public function __construct()
{
if (!config()->get('useExampleRoute')) {
response()->json('Showing examples is disabled in the settings');
}
}
public function _get()
{
$this->response(__FUNCTION__);
}
public function _post()
{
$this->response(__FUNCTION__);
}
public function _put()
{
$this->response(__FUNCTION__);
}
public function _delete()
{
$this->response(__FUNCTION__);
}
public function _head()
{
$this->response(__FUNCTION__);
}
private function response($action)
{
$response = [
'message' => 'Запрос выполнен успешно',
'date' => date('Y-m-d H:i:s'),
'controller' => __CLASS__,
'action' => $action,
'method' => request()->method(),
'header' => request()->header(),
'request' => request()->get(),
'server' => $_SERVER
];
journal()->add('request-response', ['request' => request()->get(), 'response' => $response]);
response()->json($response);
}
} Namespace контроллеры
Для использования контроллеров из собственной директории, необходимо:
- Создать директорию, например, /local/api/controllers/;
- Создать файл с классом, например, /local/api/controllers/product.php;
- Указать для класса корректный namespace (согласно PSR);
/**
* Copyright (c) 2019 Denis Artamonov
* Created: 3/18/19 12:13 PM
* Author: Denis Artamonov
*/
namespace Local\Api\Controllers;
class Product
{
public function __construct()
{
// code ...
}
public function _get()
{
// code ...
}
public function _post()
{
// code ...
}
public function _put()
{
// code ...
}
public function _patch()
{
// code ...
}
public function _delete()
{
// code ...
}
public function _head()
{
// code ...
}
} - Указать в карте роутов, в качестве контроллера, собственный класс через его namespace.
/**
* Copyright (c) 2019 Denis Artamonov
* Created: 3/18/19 12:19 PM
* Author: Denis Artamonov
*/
return [
'GET' => [
'product/get' => [
'controller' => '\Local\Api\Controllers\Product@_get'
]
],
'POST' => [
'product/post' => [
'controller' => '\Local\Api\Controllers\Product@_post'
]
],
'PUT' => [
'product/put' => [
'controller' => '\Local\Api\Controllers\Product@_put'
]
],
'PATCH' => [
'product/patch' => [
'controller' => '\Local\Api\Controllers\Product@_patch'
]
],
'DELETE' => [
'product/delete' => [
'controller' => '\Local\Api\Controllers\Product@_delete'
]
],
'HEAD' => [
'product/head' => [
'controller' => '\Local\Api\Controllers\Product@_head'
]
]
]; Файловые контроллеры
Для использования контроллеров из файлов, необходимо:
- Создать директорию, например, /local/api/controllers/;
- Создать файл с необходимым кодом, например, /local/api/controllers/product.php;
/**
* Copyright (c) 2019 Denis Artamonov
* Created: 3/18/19 12:37 PM
* Author: Denis Artamonov
*/
// Массив в который формируем ответ
$response = [];
// code ...
// Возвращаем ответ клиенту
response->json($response); - Указать в карте роутов, в качестве контроллера, путь к PHP-скрипту.
/**
* Copyright (c) 2019 Denis Artamonov
* Created: 3/18/19 12:43 PM
* Author: Denis Artamonov
*/
return [
'GET' => [
'product/get' => [
'controller' => $_SERVER['DOCUMENT_ROOT'] . '/local/api/controllers/product.php'
]
],
'POST' => [
'product/post' => [
'controller' => $_SERVER['DOCUMENT_ROOT'] . '/local/api/controllers/product.php'
]
],
'PUT' => [
'product/put' => [
'controller' => $_SERVER['DOCUMENT_ROOT'] . '/local/api/controllers/product.php'
]
],
'PATCH' => [
'product/patch' => [
'controller' => $_SERVER['DOCUMENT_ROOT'] . '/local/api/controllers/product.php'
]
],
'DELETE' => [
'product/delete' => [
'controller' => $_SERVER['DOCUMENT_ROOT'] . '/local/api/controllers/product.php'
]
],
'HEAD' => [
'product/head' => [
'controller' => $_SERVER['DOCUMENT_ROOT'] . '/local/api/controllers/product.php'
]
]
];