Быстрое создание 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 минут. При наличии БД. Если же БД нет, то времени все равно займет очень не много.