Jii 0.8: Миграции, ReactViews, изоморфное приложение и прочие плюшки

    Привет всем жителям и гостям хабра и с новым годом! :)
    В этой статье я хочу рассказать о том, с какими фичами 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
      Все круто, но грамматические ошибки исправьте:
      консоле => консоли
      в случаи => в случае
      • +1
        Сори за ошибки, видимо от НГ еще не отошел =) Поправил.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.