Привет всем жителям и гостям хабра и с новым годом! :)
В этой статье я хочу рассказать о том, с какими фичами Jii вступил в 2016-й год и что его в ждет в новом году.
Итак, начнем по порядку.
Console Application
Консольное приложение обновилось, теперь оно поддерживает методы prompt, select, confirm и подобные из хелпера Console (yiihelpersBaseConsole). Если приложение инициализируется через jii-workers (статья на хабре), то консольное приложение запустится при добавлении роута в качестве аргумента:
jii migrate/create
Таким образом, файл jii (пример) становится входной точной как для консольного приложения, так и для веб.
Консольное приложение имеет ключ «console», для его конфигурации нужно передать объект конфигурации с ключом console в метод application():
require('jii-workers')
.application('console', Jii.mergeConfigs( // Конфигурация консольного приложения
require('./app/config/main'),
require('./app/config/server/console')
))
.application(Jii.mergeConfigs( // Конфигурация веб-приложения
require('./app/config/main'),
require('./app/config/server/web')
))
Если опустить аргументы, то запуститься веб-приложение. Запустите jii help для просмотра доступных консольных команд.
Миграции
В версии 0.8 появились миграции, портированные из Yii2. Весь функционал и АПИ сохранен, единственное чего не хватает — так это тестов. Если нашли баг — то сделайте pull request с исправлением или создайте тикет.
Загрузчик классов
Теперь Jii знает о всех своих классах в любом из пакетов (автосгенерированный список), а это значит, что при подключении Jii, не нужно через require(..) подключать все пакеты, достаточно подключить только jii:
// Было:
global.Jii = require('jii');
require('jii-model');
require('jii-ar-sql');
require('jii-httpserver');
require('jii-comet');
// Стало
global.Jii = require('jii');
И если вы забыли установить какой-то из пакетов, в консоле вы увидите понятную ошибку, указывающее на это.
Backbone-style модели и коллекции
В Jii появились коллекции и модели, API которых похож и во многом повторяет API Backbone (причем API Yii2 моделей сохранено). Помимо этого, в моделях и коллекциях добавились события, поддерживающие вложенность. Т.е. если у модели есть связи, то можно подписаться на изменения связанной модели, даже если она еще не подгружена. Аналогично поумнели геттеры и сеттеры.
Вот небольшой список поддерживаемых форматов получения/добавления/изменения значений и подписываний на события:
Collection formats:
coll.add({id: ..})
coll.push({id: ..}, {id: ..})
coll.add([{id: ..}])
coll.set({id: ..})
coll.set('[0].name', '..')
coll.at(-1).get('name')
coll.on('add remove change', function (){})
coll.on('change:title', function (){})
coll.on('change:user.name', function (){})
Model formats:
model.set('name', '..')
model.set('foo.bar', '..')
model.set('foo[0].bar', '..')
model.get('foo.bar.zz.rr[0].qwe')
model.get('foo[0].bar')
model.on('change', function (){})
model.on('change:foo', function (){})
model.on('change:foo.bar.qwe', function (){})
model.on('change:foo.bar[0].qwe', function (){})
К сожалению, документации пока еще нет, но можно посмотреть тесты коллекций и моделей.
ReactJS
Изначально я планировал не делать жесткой привязки к вьюшкам, хотелось, чтобы любая клиентская или серверная библиотека, отвечающая за букву «V» из «MVC» работала с Jii без сложных плясок с бубном. Как прояснилось позже — сочетать большие фреймворки типа angularjs, sencha — очень сложно из-за наличия в них своих моделей.
Начались поиски вьюшек для Jii: они должны были быть современными, с биндингами данных, не привязанными к структуре приложения, желательно изоморфными. Реактивные вьюшки от фейсбука идеально ложатся в эти критерии, поэтому к underscore шаблонам добавилась альтернатива — ReactJS.
Изоморфное приложение
ReactJS изначально создан быть изоморфным, контроллеры в Jii были изоморфными и ранее, модели и коллекции прокачались. Также появились такие компоненты как Neat, ContextProfiles, RemoteConnection и т.п., которые позволяют сделать код изоморфным. Все это еще находится в альфе, поэтому множества примеров, тестов, стабильности и документации сейчас нет. Но есть boilerplate, показывающий возможности новых фич.
Клиент-сервер биндинги
Биндиги реализованы через библиотеку NeatComet, которую разработал коллега из нашей компании (ExtPoint). Она уже используется в некоторых проектах, но пока не готова к массовой публикации. В случаи с Jii — это не важно, т.к. Jii имеет собственное API поверх NeatComet.
2016
Все эти вышеперечисленные и другие фичи будут развиваться в 2016-ом году. Планов много, идей еще больше, но времени как обычно мало.
Напомню, Jii — опенсорсный проект, поэтому я буду очень рад, если кто-то присоединится к его разработке. Пишите на affka@affka.ru и заглядывайте в раздел разработки.
Сайт фреймворка — jiiframework.ru
GitHub — github.com/jiisoft
Нравится идея фреймворка? Ставь звезду на гитхабе!
Автор: affka