Привет всем жителям и гостям хабра и с новым годом! :)
В этой статье я хочу рассказать о том, с какими фичами Jii вступил в 2016-й год и что его в ждет в новом году.

Итак, начнем по порядку.

Console Application


Консольное приложение обновилось, теперь оно поддерживает методы prompt, select, confirm и подобные из хелпера Console (\yii\helpers\BaseConsole). Если приложение инициализируется через 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

Нравится идея фреймворка? Ставь звезду на гитхабе!


Комментарии (2)


  1. seokirill
    05.01.2016 18:53
    +1

    Все круто, но грамматические ошибки исправьте:
    консоле => консоли
    в случаи => в случае


    1. affka
      05.01.2016 21:18
      +1

      Сори за ошибки, видимо от НГ еще не отошел =) Поправил.