Upload
devday
View
902
Download
3
Embed Size (px)
DESCRIPTION
Сергей Коржнев Архитектор версии 1.4 2ГИС Web API Архитектура кода нового 2ГИС Web API или куда мы дели MVC Тезисы: ● Как организован код в старой версии. ● Вдумчиво смотрим, как мы используем Yii, хватаемся за голову и клавиатуру. Там отрезаем, тут пришиваем, и вуаля! ● Ну и делаем выводы, как мы забороли две классические проблемы программирования: борьба с дублированием кода и сложностью системы.
Citation preview
Кто такой? С какого района? Почему я такой дерзкий?
● Архитектор и идейный вдохновитель новой версии справочного API
● До этого приложился к картографическому API (javascript-библиотека)
● Также был замечен в рядах разработчиков Флампа
Справочное API? Не, не слышал.
REST API
http://catalog.api.2gis.ru/search?what=музей&where=Москва&version=1.3&key=1234567890&output=json
Справочное API? Не, не слышал.{
"api_version": "1.3","response_code": "200","total": "265","result": [
{"id": "4504127908471392","lon": "37.6798458645247","lat": "55.6172926242175",// ...
},// ...
]}
● Почему простой MVC не подходит для построения развесистого server-side API?
● Как сделать хорошо?
● Наш опыт
О чем доклад?
Вопросы к Представлению?
● Тривиальные форматы JSON, JSONP, XML
● Yii-представление больше для HTML.
● Как, блин, рефакторить?
Вопросы к Контроллеру?
● Как его тестировать?
● Как быть когда фильтров и параметров много?
● Как быть нестандартным роутингом?
Инструкция как сделать хорошо
Шаг 1 - Распиливаем Модель
Шаг 2 - Разводим зоопарк классов
Шаг 3 - Анализируем результат
Разруливание зависимостейreturn array( 'components' => array( 'geoCoder' => array( 'class' => 'ext.geoCoder.ExtGeoCoder', 'dbConnection' => 'geoDB', ), 'geoDB' => array( /* ... */),
),);
Инструкция как сделать хорошо
Шаг 1 - Распиливаем Модель
Шаг 2 - Разводим зоопарк классов
Шаг 3 - Анализируем результаты
ЗапросGeoSearchRequest extends RequestModel { public $what; public $is_cool_place; public function rules() { array('WhatValidator', 'min' => 2, 'max' =>50), array('BooleanValidator', 'param' => 'is_cool_place', 'required' => false), } }
Валидатор
class WhatValidator extends Validator { public function run(RequestModel $model) { $this->checkRange( $model, 'what', $model->minLength, $model->maxLength ); }}
GeoService extends DGService { private $_request;
public function search() { $data = Yii::app()->geo->search($this->_request->what, $this->_request->is_cool_place); return $this->formatSearch($data) }
private function formatSearch(array $data) { $data['total'] = count($data); return $data; }}
Сервис
Структура директорийapp/
services/GeoService.php
validators/WhatValidator.php
requests/geo/
GeoSearchRequest.php
Инструкция как сделать хорошо
Шаг 1 - Распиливаем Модель
Шаг 2 - Разводим зоопарк классов
Шаг 3 - Анализируем результаты
Request, Validator
● Конфигурирование вместо программирования
● Строгость и безопасность
● Устранение дублирования кода
● Четкие обязанности компонентов● Все на своих местах● Консистентный интерфейс● Единообразие кода● Скорость разработки● Unit-тесты
Profit
● +1 велосипед
● Заточили архитектуру под свои задачи
● Готовы к наращиванию функциональности API
Итого