Разработка развесистого API на Yii фреймворке. Коржнев

Preview:

DESCRIPTION

 

Citation preview

Разработка развесистого 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

Спасибо. Вопросы?s.korzhnev@2gis.ruСергей Коржнев