Быстрое создание API на MIND-CMS

Исходные данные:

1. У нас есть некая БД, в которой лежит некий набор данных, которые мы хотим отдавать в виде REAT API  в JSON формате.

Для примера, возьмем простую таблицу histrorian вида:

Считаем, что на начало работ, у нас есть только таблица с данными и все.

Реализация:

И так в целом мы можем решить задачу по сути в одну строку, но дальнейшая поддержка будет не очень удобной. Поэтому реализуем на примере создания полноценного модуля:

1. Создаем папку api по пути /system/modules. В итоге у нас должна появиться папка /system/modules/api/


2. Далее в модуле api на нужны:

2.1. Контроллер, например /system/modules/api/controllers/index.php

2.2. Модель для работы с данными, можно и без нее, но поддержка будет сложнее в будущем, поэтому создадим модель /system/modules/api/models/Historian.php. Если модель будете создавать через GKG то файл создавать не надо.

2.3. И для того чтобы модуль завелся нам понадобится файл прав /system/modules/api/rights.php


3. После создания эти файлов мы получим файловую структуру вида:

Структура папок


4. В модели нам надо описать структуру таблица. Для этого можно описать ее руками, а можно воспользоваться модулем GKG. С его помощью сформируем модель менее чем за минуту. Для этого:

4.1. заходим в модуль GKG  по адресу /gkg/admin. И нажимаем кнопку "создать модуль"  

4.2. в новом окне выбираем "название таблицы" -> historian

4.3. вводим название модели "Historian".

4.4. поле "название модуля" вводим "api" (как называется ваш модуль)

4.4. остальные поля не трогаем и жмем "сохранить".

В результате в папке у вас создастся модель со следующим содержимым:

namespace modules\api\models;

use core\Model;

/**
* Class Historia
*
* @property string id - Первичный ключ
* @property string mod_key - ключ доступа к истории
* @property string value - значение которые были
* @property string create_at - дата обновления
* @property string user_id - кто изменил
* @property string row_key - ключ записи модуля
*/
class Historian extends Model
{
public $table = 'historian';

public function factory($id = false)
{
if ($id == false or !$this->getOne($id)) {
$this->id = "";
$this->mod_key = 'null';
$this->value = 'null';
$this->create_at = "";
$this->user_id = 'null';
$this->row_key = 'null';

}
return $this;
}
}

Обратите внимание, что gkg создал не просто модель, но и подтянул описание комментариев из таблицы и создал фабрику.

ВАЖНО: если файл уже был создан, то gkg проигнорирует создание, тем самым не трогая ВАШ файл.


5. Наполним контроллер, который будет считывать нам все записи из таблицы Historian через модель и отдавать в видe массива объектов в JSON.

namespace modules\api\controllers;

use core\Controller;
use modules\api\models\Historian;

class index extends Controller
{
public function actionIndex()
{
return Historian::instance()->getAll();
}
}

Если мы сейчас попробуем запросить апи по адресу /api то увидим, что ничего не работает. Нам не хватает прав на модуль


6. Наполним rights.php

return [
'index' => [ // контролер
'role' => ['*'],
// кому разрешен доступ к контролеру
],
];

DONE

Мы закончили создание апи. Если откроем ссылку /api. То увидим:

[
{
"id": "1",
"mod_key": "2",
"value": "new value",
"create_at": "2023-11-18 20:52:43",
"user_id": "15",
"row_key": "new row"
}
]

Иными словами, мы получили что хотели. При этом с помощю поведения модели, мы можем ограничивать результат, добавлять условия выборки и многое другое.

С помощью rights.php мы можем регулировать уровень доступа к api. Назначая свои роли на доступ к разным экшенам контроллера.

Итого на создание простого REST АПИ у нас ушло менее 10 минут. При наличии БД. Если же БД нет, то времени все равно займет очень не много.