Состоялся релиз PHP фреймворка Yii версии 2.0.6.

Инструкции по установке и обновлению доступны по адресу http://www.yiiframework.com/download/.

Версия 2.0.6 является патч-релизом для ветки 2.0 и содержит более 70 небольших улучшений и исправлений, многочисленные улучшения документации и значительный прогресс с её переводом.

Спасибо всем, кто участвует в разработке фреймворка. Ваши pull-request-ы, обсуждения и другая помощь незаменимы.

За процессом разработки фреймворка можно следить поставив звёздочку или нажав кнопку «watch» на GitHub.
Также можно подписаться на наши Twitter и Facebook.

Далее представлен небольшой обзор самых интересных нововведений.



Улучшенный синтаксис миграций



Изначально мы планировали построитель схемы в версии 2.1, но pana1990 и vaseninm отлично поработали и теперь синтаксис в миграциях стал намного более приятным:

$this->createTable('example_table', [
    'id' => $this->primaryKey(),
    'name' => $this->string(64)->notNull(),
    'type' => $this->integer()->notNull()->defaultValue(10),
    'description' => $this->text(),
    'rule_name' => $this->string(64),
    'data' => $this->text(),
    'created_at' => $this->datetime()->notNull(),
    'updated_at' => $this->datetime(),
]);


Обработка ошибок



В данном релизе довольно много исправлений и улучшений, призванных сделать обработку ошибок ещё более стабильной и полезной:

— Yii теперь отлично справляется с фатальными ошибками HHVM.
— Если FileCache не сумел записать в файл, это будет видно в логах.
yii\web\ErrorAction теперь показывает 404, а не пустую страницу в случае прямого перехода по URL.
— Когда yii migrate отказывается работать из за отсутствующей директории, путь к ней показывается в ошибке.
Json::encode() и Json::decode() лучше обрабатывают ошибки, кидая понятные исключения.
ErrorHandler::logException() теперь логирует весь объект, а не только его строковое представление.

Больше контроля над ActiveForm из JavaScript



Вы можете обновлять ошибки для определённых полей:

// добавить ошибку
$('#contact-form').yiiActiveForm('updateAttribute', 'contactform-subject', ["I have an error..."]);

// убрать ошибку
$('#contact-form').yiiActiveForm('updateAttribute', 'contactform-subject', '');


Или для всех полей и резюме сразу:


$('#contact-form').yiiActiveForm('updateMessages', {
    'contactform-subject': ['Really?'],
    'contactform-email': ['I don\'t like it!']
}, true);


Улучшения yii message



Теперь поддерживается создание файлов .pot.

Команда теперь отлично переваривает вложенные вызовы:

Yii::t('app', 'There are new {messages} for you!', [
    'messages' => Html::a(Yii::t('app', 'messages'), ['user/notifications']),
]);


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

Кроме того, была добавлена опция markUnused, позволяющая отключить добавление @@ к неиспользуемым строкам.

Asset-ы



Теперь можно настроить, что публиковать, а что нет:

class MyAsset extends AssetBundle
{
    public $sourcePath = '@app/assets/js';
    
    public $js = [
        'app.js',
    ];
    
    public $depends = [
        'yii\web\YiiAsset',
    ];
    
    public $publishOptions = [
        'except' => '*.ts', // exclude TypeScript sources
        // 'only' => '*.js', // include JavaScript only
    ];
}


Можно изменить алгоритм хеширования для имён директорий из web/assets. Сделать это можно прямо из конфигурации приложения:

return [
    // ...
    'components' => [
        'assetManager' => [
            'hashCallback' => function ($path) {
                return hash('md4', $path);
            }
        ],
    ],
];



Дополнительные поля в хранилище сессий



Теперь вы можете легко хранить дополнительные данные в хранилище сессий. Пока поддерживается только yii\web\DbSession, но в будущем поддержка может быть расширена. Для конфигурации надо изменить конфигурацию приложения:

return [
    // ...
    'components' => [
        'session' => [
            'class' => 'yii\web\DbSession',
            'readCallback' => function ($fields) {
                return [
                    'expireDate' => Yii::$app->formatter->asDate($fields['expire']),
                ];
            },
            'writeCallback' => function ($session) {
                return [
                    'user_id' => Yii::$app->user->id,
                    'ip' => $_SERVER['REMOTE_ADDR'],
                    'is_trusted' => $session->get('is_trusted', false),
                ];
            }
        ],
    ],
];

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


  1. affka
    06.08.2015 05:12
    +3

    Отлично! Очень радует формат миграций и исключения в ассетах, а то костыль писать приходилось.

    А почему бы миграции не сделать двухнаправленные? Чтобы можно было в up() писать createTable, а down() автоматически понимал что созданную таблицу нужно удалить. У нас обычно в миграциях что-то создается, добавляется или меняется. В остальных случаях можно кидать исключение, мол не могу автоматически сгенерировать down() метод.
    Или может быть есть уже такое? Кто подскажет?


    1. Unclead
      06.08.2015 06:59
      +1

      Есть issue на эту тему github.com/yiisoft/yii2/issues/7928


      1. wild_honey
        10.09.2015 14:00

        Cоздавал подобный issue github.com/yiisoft/yii2/issues/7928 с ссылкой все на тот же phinx.org Но тогда он не получил поддержки. Хотя идею эту я реализовал на одном из проектов и остался ей полностьью доволен. Особенно помогает при старте проекта когда 90% миграции добавляют сущность.


        1. SamDark
          10.09.2015 15:06

          Ну, не то чтобы не получил… issue открыт, плюсики есть. Как-нибудь запилим.


          1. wild_honey
            10.09.2015 15:11

            Опечатался в первом комментарии, имел в виду вот этот github.com/yiisoft/yii2/issues/593


            1. SamDark
              10.09.2015 17:31

              О! Слинковал с новым issue. Если оно всплыло повторно, значит не только вам нужно.


  1. Playbot
    06.08.2015 09:42

    Формат миграций стал прям супер-супер, вот только возможность добавить комментарий (как-то так бы ->comment('комментарий')) не реализовали, интересно почему?


    1. SamDark
      06.08.2015 09:55
      +1

      Не успели.


    1. affka
      06.08.2015 10:29

      pull request тебе в помощь :)


      1. vaseninm
        06.08.2015 10:35

        1. SamDark
          06.08.2015 11:18

          Почти. Там проблемы.


  1. vaseninm
    06.08.2015 10:34
    +1

    Парни из core team (@samdark и @cebe) скромно скрыли свой вклад в новые миграции)


  1. vaseninm
    06.08.2015 11:21
    +1

    SamDark, а как релизятся зависимые проекты?


    1. SamDark
      06.08.2015 11:31

      Независимо. Сейчас чуть передохнём и тоже релизнем по одному.


  1. MaxFactor
    06.08.2015 18:47
    +1

    Я конечно рад, кто есть такой фрэймворк, но я считаю что он УБОГИЙ. За столько лет так и не смогли добавить нормальные виджеты для работы с временем, датой, датой и временем.


    1. SamDark
      06.08.2015 19:03

      Сможете более развёрнуто расписать? Что для вас «нормальные виджеты для работы с временем, датой, датой и временем» и чем не устраивают те, что уже есть?


      1. MaxFactor
        06.08.2015 20:00
        -1

        Легко, скачайте последнюю базовую версию Yii2+ установите и попробуйте через слой вывести input-виджеты время, дата, время и дата. Там только есть дата виджет и все станет ясно.


        1. zelenin
          06.08.2015 20:33
          +1

          через слой? Что есть слой?

          В симфони вообще нет виджетов, а убогим его трудно назвать.
          Да и виджеты времени — это обертки над сторонними виджетами, пишущимися за 10 минут. Так что такой аргумент в пользу убогости явно необъективен.


        1. SonicGD
          06.08.2015 20:35
          +1

          github.com/2amigos/yii2-date-time-picker-widget вам в помощь. Причём только тут фреймворк?


          1. MaxFactor
            06.08.2015 21:24
            -1

            А зачем мне фрэймворк в котором надо искать, перебирать и мострячить компонент который ОБЯЗАН быть в стандартной комплектации.
            Вот пример:
            — Не давно попросили сервис создать на Yii так я сервис писал 3 часа, а компоненты времени искал, перебирал и тестил 13 часов.
            Зачем такой фреймворк. Одна из задач при создании фреймворка — это экономия времени, если Yii не экономит время вывод один — он убог. Зачем писать фреймворк где виджеты урезаны и нужно использовать сторонние? Ну сделали бы тогда без виджетов вообще или сделайте все базовые — почему надо не туда не сюда, как дороги в России, вроде есть, а вроде нет.


            1. Mendel
              06.08.2015 22:37
              +1

              Это вы еще Ларавел не юзали…
              Нужен RBAC — выбирай из восьми кастомных.
              Шаблонизатор? Есть два встроенных, но большинство юзают твиг…
              Хочешь собственный класс правил для урлменеджера? Придется писать не только рулсы но и сам урлменеджер. Ну и что, что ядро не умеет кастомные вещи, зато его просто переопределять. В юии есть из коробки? Так это потому что он кривой…
              И так во всём. Во всём-всём… Как линунс времен 90-х.

              У меня у самого много претензий к Юии, много чего не хватает, но цепляться к неполному набору виджетов в ядре? гм…


            1. zelenin
              06.08.2015 22:44

              начнем с того, что в стандартной комплектации наоборот не должно быть и тех виджетов, которые там есть сейчас. Это реверанс в сторону начинающих программистов, собственно из-за которых фреймворк так и популярен (также как и Ларавел).
              Фреймворк должен решать более низкоуровневые потребности, чем удобный ввод даты в UI. А из вашего высказывания понятно, что вы путаете фреймворк с cms. На фреймворке программируют, а не собирают проект из плагинов.


              1. MaxFactor
                06.08.2015 23:00

                Я полностью с Вами согласен. Но если бы не было этих виджетов я вообще никогда бы в Yii не полез.
                «Фреймворк должен решать более низкоуровневые потребности, чем удобный ввод даты в UI» — спорный вопрос.


                1. zelenin
                  06.08.2015 23:06

                  никапли не спорный. ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%B5%D0%B9%D0%BC%D0%B2%D0%BE%D1%80%D0%BA


                  1. MaxFactor
                    07.08.2015 00:04

                    Ничего по данной ссылки подтверждающие Ваши слова не увидел, как и опровергающие мои.
                    «Текущая версия страницы пока не проверялась опытными участниками „


                    1. zelenin
                      07.08.2015 00:05

                      тогда продолжать не вижу смысла.


                1. hlogeon
                  11.08.2015 18:00
                  +2

                  Мне кажется, вы таки зря полезли в Yii и не понимаете что есть Framework. PHP-фреймворк вообще может не содержать(я бы даже скорее сказал не должен содержать) UI-элементов.


              1. clockworkbird
                21.08.2015 11:55
                +1

                Вообще, лучше, чтобы фреймворком предлагались не только инструменты, но и какой-то вариант реализации (дополнительными приложениями, а не в ядре — идеально), и набором best practices.
                Иначе слишком много приходится строгать.
                Это проходил на собственном опыте при разработе на ZF1. Все можно сделать, но все нужно делать. В результате каждый делал по своему и ни о какой «питательной среде» не было и речи — результат — неплохой фреймворк фактически похоронен.
                Фреймворк нужен для разработки проектов, а не разработки инструментов.
                Поэтому и RoR настолько популярен. Этим и нравится Yii2.


            1. SamDark
              07.08.2015 16:23

              Так есть же yii\jui\DatePicker. Чем не оно?


              1. MaxFactor
                07.08.2015 17:43

                работает только с датой, а с временем нет и дата-время тоже нет — это огорчает. Мне иногда надо сбацать быстро прототипный проект с базовым дизайном и когда касается работы со временем — начинается проблема.


                1. Zhuravljov
                  10.08.2015 11:22
                  +1

                  JQueryUI, с учетом его распространенности, можно считать промышленным стандартом, и для него сделали расширение yii2-jui c полным набором виджетов. Но там никогда не было контрола для совмещенного ввода даты и времени. За то на стороне появился целый зоопарк таких плагинов. Странно ожидать официальной поддержки на все это многообразие.
                  Выберите любой, который лучше всего подходит для ваших проектов, и сделайте свою обертку. Это не сложно, и много времени не займет.
                  Или попробуйте github.com/zhuravljov/yii2-datetime-widgets. Делал для своего проекта когда в интерфейсе понадобился ввод даты-времени и временных интервалов.


                  1. MaxFactor
                    10.08.2015 11:44
                    -3

                    Но сделать один среднечковый-стандартный виджет времени и включить его в базовую комплектацию — это не сильная проблема. А вот потратить день на перебор зоопарка и найти рабочий пример — это потеря времени.

                    Если бы я всегда работал с Yii то у меня был бы отсеян этот зоопарк компонент и я знал какие лучше, а какие нет. Но я с Yii работаю редко, раз в пол года и каждые пол года приходиться тратить время на поиск примитивного рабочего компонента.

                    Я понимаю в чем проблема Yii и могу решить ее сам, данный разговор я затеял не ради себя, в последнее время я использую свой фрэймворк на MVC модели Javascript+php / node Просто новички которые сталкиваются с Yii упарываются в эту же проблему со временем/датой. Мое мнение, или не включать тогда компоненты в фрэймворк или делать все базовые с возможностью установки внешних, а в данном случае разработчики остановились на середине.
                    Yii мне нравиться как сделан, удобно и понятно, с ним приятно работать. Я его не использую в коммерческих проектах, но делаю на нем демки-прототипы.

                    PS: Я нашел компонент который хотел, не надо мне давать ссылки.


    1. clockworkbird
      21.08.2015 11:23
      +1

      Вот уж убогим Yii2 никак назвать нельзя. И очень радует направление развития. Разработчикам огромное спасибо.
      Так вот находятся люди, которые еще и ругают бесплатный, открытый продукт.
      Если вам чего-то во фреймворке не хватает — ну сделайте хоть что-то сами и отправьте пулл реквест — будете и сами пользоваться, и все вам скажут спасибо.

      После перехода с ZF1 (для которого писали сами и миграции, и кучу логики, и кучу компонент) в Yii2 пока не удается сделать ничего нового (даже обидно) — все уже есть или в коробке или в расширениях и работает на удивление хорошо.


      1. MaxFactor
        21.08.2015 11:46

        «Если вам чего-то во фреймворке не хватает — ну сделайте хоть что-то сами и отправьте пулл реквест» — я нашел вариант получше — написал свой фрэймворк. Я указал на незначительную проблему Yii, об которую КАЖДЫЙ «ломает зубы».

        Если продукт бесплатный — что у него не может быть проблем о которых стоит тут написать?


        1. SamDark
          21.08.2015 12:19
          +1

          Ну, далеко не каждый. Далеко не всем нужны виджеты для времени и не для всех проблема выбрать из 5—6 вариантов. Но вообще про проблемы писать однозначно надо. И за это вам спасибо.


          1. Mendel
            21.08.2015 12:44
            +1

            Выбирать из 5-6 вариантов СИСТЕМНЫХ вещей это сакс. Выбирать из 5-6 вариантов простенького виджета который всегда можно переписать самому в случае проблем — элементарно.
            С другой стороны при росте проекта оказывается что ты таких расширений поставил штук 18, они частично дублируют друг-друга, у каждого свой стиль, разные решения каких-то моментов, и разные отступления от бестпрактикс…
            И тут уже стоишь перед выбором о том, чтобы рефакторить всё, чтобы упорядочить зоопарк, или поддерживать зоопарк…
            В идеале конечно было бы иметь некую сертификацию расширений, чтобы были расширения с пометкой «рекомендуемое официально», но это уже фантастика :)


            1. SamDark
              21.08.2015 13:12
              +2

              Это не фантастика, а планы ;)


              1. Mendel
                21.08.2015 15:46

                Это было бы очень приятно.
                оффтоп: скажите, я правильно понимаю, что в двойке нет возможности как в первом получить информацию о связях модели по типу public function relations()?
                К примеру у меня в 1.1 было расширение которое по наличию связи с User (при условии что таковая связь одна) создавала *Own действия в RBAC для CRUD.
                Ну или к примеру хочется сделать для gii генератор миграций по готовой модели. Можно было бы брать правила валидации и связи, что давало неплохой набор для бутстрапинга миграции. Сейчас связи отпадают…
                Ну или еще применение, от которого я не готов отказаться, так что для части своих моделей я таки вернусь к старому синтаксису переопределив магию — хочу сделать в своем приложении генератор запросов по аналогии с 1с-построителем запросов, т.е. GUI-формочку в которой есть все уместные для этой задачи модельки, их свойства, связи, и тыкая мышкой можно настроить запрос с простейшими join, unit sum условиями и т.п.
                От идеи смотреть на внешние ключи схемы базы отказался потому что кое-кто из упомянутых тут ребят очень долго распевал мне о том как удобно в юии2 работать со связыми между моделями из разных СУБД и всё такое… :)


                1. SamDark
                  21.08.2015 16:29

                  В общем-то, да. Просто так получить информацию о связях теперь не выйдет.


  1. Rathil
    07.08.2015 00:25
    +1

    Круто! Лично для меня самое ожидаемое из этих фич, это расширение asset-ов.


    1. uaoleg
      05.09.2015 00:45
      -1

      Так и не проникся asset'ами и ушёл на grunt.


      1. uaoleg
        13.09.2015 16:13

        Вот кто-то минуснул, а я же это не сам придумал: yii2-cookbook.readthedocs.org/structure-asset-processing-with-grunt