Разработка развесистого api на yii фреймворке. Коржнев
DESCRIPTION
TRANSCRIPT
Разработка развесистого API на Yii фреймворке
Сергей Коржнев
Крайний за архитектуру справочного API 2ГИС
2009 год
>50 фреймворков
Технологический стек
Справочное API 2ГИС
http://catalog.api.2gis.ru/search
?what=музей &where=Москва &version=1.3 &key=1234567890 &output=json
API 2ГИС в цифрах
уников в месяц
online
более 500 проектов
> 10 000 000
Большой API
Сложное внутреннееустройство
Более 50 методов
Аспекты
ДокументацияАвтотестыАрхитектура
Маленькое API
— Просто
— Быстро
— Стандартный подход
По мере роста
Разработка
По мере роста
Разработка Баги
По мере роста
Разработка СложностьБаги
Решение
Слоистая архитектура
Application Layer
Physical Layer
Data Link Layer
Network Layer
Transport Layer
Session Layer
Presentation Layer
Application Layer
MVC
Model
ControllerView
Модель
ActiveRecord
Бизнес-логика
Controller
Бизнес-логика
Yii-расширения
CApplicationComponent
Конфигурация
return [
'components' => [
'geoCoder' => [
'class' => 'ext.geoCoder.ExtGeoCoder',
'country' => 'Russia'
],
//...
],
];
ActiveRecord
Представление
Model
ControllerView
Плохо
Классический рендеринг в файлах
Плохо
$this->render('file3', $data);
$this->render('file2', $data);
$this->render('file1', $data);
file2
file1
Контроллер
Плохо
Контроллер
Рендеринг
Непосредственные обязанности
Хорошо
11Класс контроллера
Класс представления
Контроллер
Model
ControllerView
Валидация и фильтрация
/geo/search?what=кафе'; DROP TABLE users;
SELECT * FROM users WHERE 'x' = 'x
Фильтры контроллера
Лучше, чем ничего
Но можно лучше
Запрос
/geo/search?what=кафе
Инкапсуляция запроса
class GeoSearchRequest extends RequestModel {
public $what;
}
Объект запроса
class GeoSearchRequest extends RequestModel {
public $what;
public function rules() {
return [
['WhatValidator',
'min' => 2,
'max' => 50,
'required' => true
]
];
}
}
Валидатор
class WhatValidator extends Validator {
public function run(RequestModel $model) {
// ...
}
}
Профит
Программирование
Декларативный подход
Структура директорий
/protected /controllers GeoController.php /views GeoView.php /requests /geo GeoSearchRequest.php /extensions /geo ExtGeo.php /models /components
/protected /controllers GeoController.php /views GeoView.php /requests /geo GeoSearchRequest.php /extensions /geo ExtGeo.php /models /components
Модель: Бизнес-логика и ActiveRecord
Представление
Контроллер
Объект запроса
Валидатор запроса
ВыводыКомпоненты архитектуры
Модель: Бизнес-логика и ActiveRecord
Контроллер
Представление
Объект запроса
Валидатор запроса
Автотесты
Unit тесты
Правильно
Дорого
Гибридные тесты
Гибридные тесты
Данные
Гибридные тесты
Усилия Профит
class GeoSearchRequest extends RequestModel {
public $what;
public function rules() {
return [
['WhatValidator',
'min' => 2,
'max' => 50,
'required' => true
]
];
}
}
Формат ответа API
Структура
Обязательность
Тип данных
Все уже придумано до нас
XML Schema
JSON Schema
JSON Schema & PHP
Формат
http://json-schema.org/
Библиотека от института Беркли
https://github.com/justinrainbow/json-schema
/protected /controllers GeoController.php /views GeoView.php /requests /geo GeoSearchRequest.php /extensions /geo ExtGeo.php /models /components
JSON
{ "a":10, "b":"boo" }
/protected /controllers GeoController.php /views GeoView.php /requests /geo GeoSearchRequest.php /extensions /geo ExtGeo.php /models /components
JSON Schema
{ "a":10, "b":"boo" }
{
"a": {
"type": "number",
"required": true
},
"b": {
"type": "string",
"required": true
}
}
Использование JSON Schema
Включаем только в тестах
В фоне
Ложка дёгтя
Дополнительные поля
("additionalProperties": false)
Ещё дёгтя
Формат не устаканился
Библиотеки сырые
Решение
Подозрительная библиотека
Unit тесты
Приоритеты тестов
Публичный интерфейс
JSON Schema
Дешево
Часто используется
Бизнес-логика
Документация
Документация
— Ветка на фичу
Документация
— Ветка на фичу
— Актуальность
Документация
— Ветка на фичу
— Актуальность
— Вместе с кодом
Документация
— Да ну её нафиг!
Бульдог + Носорог
"reviews_count": {
"type": "number",
"required": true,
"meta": {
"description": "Количество отзывов"
}
},
JSON Schema + документация
Дешево
Рендеринг
Тесты
Итоги
Специфика большого API
Слоистая архитектура
Автотесты
Документация + JSON Schema
Спасибо. Вопросы[email protected]Сергей Коржнев