Yii 2.0.13

    Состоялся релиз PHP фреймворка Yii версии 2.0.13. В него вошли более 90 улучшений и исправлений.


    Обратите внимание, что в релиз попали изменения, которые могут повлиять на существующие приложения. Они описаны в UPGRADE.md.


    Огромное спасибо сообществу Yii за поддержку и пулл-реквесты!


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


    Так как мы работаем над Yii 2.1, убедитесь что версия фреймворка в composer.json прописана верно (~2.0.13) и вы не обновитесь на 2.1 случайно когда он релизнется.


    Ниже мы рассмотрим самые интересные улучшения и исправления релиза. Полный список можно найти в CHANGELOG.


    Шаблоны приложений


    Как шаблон "basic", так и "advanced" теперь использую asset-packagist.org вместо Composer asset plugin.


    Vagrant окружение в advanced обзавелось XDdebug-ом. Также его стало ещё проще поднять. Необходимые плагины ставятся автоматически.


    В шаблон "basic" добавлен виджет Alert (он уже был в "advanced").


    Логирование, отладка и обработка ошибок


    Логирование, отладка и обработка ошибок — это то, чем мы занимаемся каждый день. Инструменты для этого должны работать как часы предоставляя как можно больше релевантной информации. В этом релизе на эту тему улучшения следующие:


    • yii\web\DbSession теперь использует возможности обработчика ошибок для показа страницы исключения. Как оказалось, довольно часто разработчики забывали проверить объекты на существование при записи дополнительных данных в базу данных с сессиями. Отлаживать это было очень тяжело, потому как ошибки были про неудачную запись в сессию. Теперь показывается реальная причина.
    • Ранее миграции можно было создавать с именами любой длины. В этой версии были введены ограничения в 180 символов, так как большая длина вызывает проблемы в некоторых СУБД. В случае превышения выбрасывается исключение.
    • В логах теперь есть миллисекунды.

    Кроме прочего, Carsten Brandt улучшил страницу исключения добавив несколько полезных кнопок:




    Фильтры данных


    Благодаря замечательной работы Павла Климова, в Yii появились фильтры данных и их интеграция в REST API. Фильтры могут быть использованы для построения сложных условий для провайдеров данных. Они отлично настраиваются и подходят как к
    веб-приложениям, так и к REST API.


    Документация доступна в разделе "Filtering Data Providers using Data Filters".


    Параллелизм


    Правильное поведение при параллелизме очень важно для высоконагруженных проектов. Мы исправили несколько ошибок на эту тему. @kidol поправил обработку состояния гонки в yii\mutex\FileMutex. @dynasource сделал то же для публикации ассетов в
    случае с использованием символических ссылок.


    Контейнер Dependency Injection и его использование


    Что поменялось:


    • Добавлена поддержка переменного числа параметров в сигнатурах.
    • Зависимости автоматически внедряются в конструктор миграций.
    • Cookie инстанциируются через контейнер.

    PHP 7.2


    PHP 7.2 уже близко. Публикуются RC и скоро будет стабильный релиз. В 7.2 есть значительные улучшения, но есть и поломка совместимости. Начиная с этого релиза Yii 2 полностью совместим с PHP 7.2.


    Кроме небольших изменений есть и вынужденное большое, которое может затронуть ваши приложения. Начиная с PHP 7.2, было запрещено использование некоторых ключевых слов в названии классов, в том числе object.
    Использование Object в PHP 7.2 вызывает фатальную ошибку. В Yii есть класс yii\base\Object, который использовался как базовый для большинства классов фреймворка, многих расширений и приложений.


    Чтобы Yii работал с PHP 7.2, мы переименовали класс. yii\base\Object помечен как deprecated. Используйте yii\base\BaseObject. Версии Yii 2 до 2.0.13 не совместимы с PHP 7.2.


    Более детально необходимые приложениям изменения описаны в UPGRADE.


    Запросы


    В класс yii\web\Request добавлен метод getOrigin(). Он возвращает HTTP_ORIGIN текущего CORS запроса.


    Также появился новый фильтр yii\filters\AjaxFilter, позволяющий ограничить доступ к действию контроллера AJAX запросами.


    Безопасность


    Была найдена и исправлена не критичная проблема CVE-2017-11516 с экранированием в обработчике ошибок в режиме отладки.


    Безопасность запросов повысилась за счёт поддержки списка доверенных прокси. В процессе мы убрали получение статуса HTTP/HTTPS через X-Forwarded-Proto по умолчанию.


    Консоль


    В консоли появились интересные улучшения. Во-первых, класс yii\console\ExitCode, содержащий константы, которые можно использовать для кодов возврата консольных команд:


    if ($this->importData()) {
        return ExitCode::OK;
    } else {
        ExitCode::SOFTWARE;
    }

    Во-вторых, стало возможным выводить таблицы:


    echo Table::widget([
        'headers' => ['test1', 'test2', 'test3'],
        'rows' => [
            ['col1', 'col2', 'col3'],
            ['col1', 'col2', ['col3-0', 'col3-1', 'col3-2']],
        ],
    ]);

    выведет


    ╔═══════╤═══════╤══════════╗
    ║ test1 │ test2 │ test3    ║
    ╟───────┼───────┼──────────╢
    ║ col1  │ col2  │ col3     ║
    ╟───────┼───────┼──────────╢
    ║ col1  │ col2  │ • col3-0 ║
    ║       │       │ • col3-1 ║
    ║       │       │ • col3-2 ║
    ╚═══════╧═══════╧══════════╝

    Базы данных


    Сергей Макинен реализовал API для управления ограничениями:


    $connection = Yii::$app->db;
    
    $connection
        ->createCommand()
        ->addUnique('unique-username', 'user', 'username')
        ->execute();
    
    $connection
        ->createCommand()
        ->dropUnique('unique-username', 'user')
        ->execute();
    
    $connection
        ->createCommand()
        ->addCheck('check-price', 'order', 'price > 0')
        ->execute();
    
    $connection
        ->createCommand()
        ->dropCheck('check-price', 'order')
        ->execute();
    
    $connection
        ->createCommand()
        ->addDefaultValue('default-balance', 'account', 'balance', 0)
        ->execute();
    
    $connection
        ->createCommand()
        ->dropDefaultValue('default-balance', 'account')
        ->execute();

    Также можно получить различную информацию:


    /** @var Schema $schema */
    $schema = $connection->getSchema();
    $fks = $schema->getTableForeignKeys('user');
    foreach ($fks as $fk) {
        echo $fk->onUpdate;
    }

    Интересующиеся могут посмотреть на этот коммит.


    Интерфейсы


    Мы начали плавно вводить интерфейсы для некоторых компонентов. На этот раз это yii\caching\CacheInterface. Будут ещё как в 2.0, так и в 2.1.


    Миграции


    Новая команда migrate/fresh вычищает базу и заново применят все миграции.


    В класс Migration добавлены опции $compact (делает вывод более сжатым) и $maxSqlOutputLength (режет SQL до заданного количества символов).


    Модули


    Сервис локатор модуля стал доступен из его контроллеров как $this->module->get('myComponent'). Если из него не удаётся получить объект, происходят попытки получить объект из сервис локатора родительского модуля. Так как родителем всех модулей является приложение, компонент, в конечном итоге, будет искаться и в нём.


    Это изменение позволят легче строить изолированные модули. При использовании $this->module->get('myComponent') вы автоматически получаете возможность переопределить зависимости из конфигурации модуля, но при этом полагаться на компоненты приложения.


    Примеры вы можете найти в "Accessing components from within modules".


    Хелперы


    В ArrayHelper появился метод setValue(). Он пишет значение в ассоциативный массив по указанному пути. Если такого пути нет, соответствующие ключи будут созданы. Если есть, то значение будет перезаписано. Поддерживаются два синтаксиса:


    ArrayHelper::setValue($array, 'key.in', ['arr' => 'val']);

    и


    ArrayHelper::setValue($array, ['key', 'in'], ['arr' => 'val']);

    Ещё один метод в релизе — StringHelper::floatToString(). Он конвертирует float в string, но, в отличие от нативного кастинга, всегда использует точки как разделитель целой части.


    RBAC


    yii\rbac\DbManager::checkAccess() перестал делать лишние запросы при получении назначений. Если вы хранили иерархию в базе, производительность после обновления, вероятно, вырастет. Также в таблицы был добавлен дополнительный индекс, что сделало сами запросы быстрее.


    Совместимость с jQuery 3.0


    Несмотря на то, что в Yii 2.1 мы пытаемся сделать фреймворк независимым от JavaScript, 2.0 завязан на jQuery. Мы обновили JS и PHP код для совместимости с jQuery 3.0.


    ActiveRecord и поведения


    В yii\db\ActiveRecordInterface через новый yii\base\StaticInstanceInterface было добавлен новый метод instance($refresh = false);. Его назначение — предоставлять статические экземпляры классов, которые могут использоваться для получения различных
    метаданных, недоступных через статические методы. Например, изменения, сделанные через DI или при помощи поведений можно сделать только на уровне объектов, но, в некоторых слуаях, было бы полезно делать их на статическом уровне класса.


    Был добавлен yii\behaviors\AttributesBehavior. Он присваивает значения одному или нескольким атрибутам объекта ActiveRecord при определённых событиях. В отличие от yii\behaviors\AttributeBehavior он работает с несколькими атрибутами сразу. Как в AttributeBehavior, так и в AttributesBehavior была добавлена опция preserveNonEmptyValues. При выставлении в true она позволяет перезаписывать значения только в том случае, когда они пусты.


    В yii\behaviors\SluggableBehavior добавлена опция skipOnEmpty. Включение её предотвращает генерацию нового slug-а если атрибут равен null или пуст.


    Asset-ы


    Хеширование директорий ресурсов теперь учитывает символические ссылки. Тем самым, исправлена инвалидация кеша в том случае, когда после перехода от копирования к ссылкам ресурсы не обновлялись. Ранее приходилось удалять содержимое директории assets.


    Компрессия и сборка ресурсов консольной командой теперь учитывает, что многие популярные библиотеки не ставят ; в конце файла. Из этого не работали некоторые комбинации скриптов.


    CSRF и кеш


    Добавлен метод yii\web\View::registerCsrfMetaTags(). Он регистрирует CSRF теги динамически, что позволяет быть уверенным, что кеширование на них не влияет.


    Новые методы форматтера


    В Formatter добавлены следующие методы:


    • asWeight() форматирует число как вес, то есть "12 kilograms".
    • asShortWeight() форматирует число как вес в короткой форме, то есть "12 kg".
    • asLength() форматирует число как длину, то есть "12 meters".
    • asShortLength() форматирует число как длину в короткой форме, то есть "12 m".

    UPDATE: и немного релизов расширений.

    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 24
    • +1
      Спасибо! Много улучшений, отдельная благодарность за mutex и rbac checkAccess.
      • +1
        А мне больше понравились новая команда миграций и кнопочки в выводе ошибок. Жаль что дебаг панель как не работала так и не работает…
        • +2

          Как это? Работает же. Давайте ссылки на issue, поправим ваш кейс.

          • +1
            Я не создавал issue. Наверное я просто жопорук, но я так и не смог сделать чтобы она отображалась. Там какая-то фигня очень странная: она есть на странице физически (видно в html/css), но у нее display: none (не мной проставленный точно).
            • +2

              Пишите в issue или мне в почту или Telegram. Попробуем разобраться.

        • +2

          Обновите доки на официальном сайте, а то там от 13 октября

        • +1

          Всем участником проекта огромное спасибо!

          • +1
            Спасибо за релиз!
            • +2
              Обновил, теперь
              PHP Warning – yii\base\ErrorException Declaration of app\helpers\ArrayHelper::setValue($array, $key, $value) should be compatible with yii\helpers\BaseArrayHelper::setValue(&$array, $path, $value)
              Черт подери, ваш setValue лучше. Спасибо за релиз!
              • +1

                амперсанд был довольно очевиден)

              • +4

                С аррайхелпере не хватает getColumns(); взять из массива массив нескольких колонок полей. А вобще я в восторге от yii. Спасибо.

                • +4
                  Как обычно. Неделю делали фильтры для статистики и вот, они приехали в новой версии фреймворка :)
                  • +2
                    Спасибо за обновление! :)
                    • +2
                      Завёл задачку в трекере обновиться до Yii 2.0.13.
                      Есть фичи, которые раньше самому руками приходилось делать. Спасибо.
                      • +2
                        Сегодня с обеда бился, не мог понять в чем причина — при api запросе не видит токена из basic auth, а он оказывается только в PHP_AUTH_USER его ищет. Полез на гитхаб в сорцы смотреть, может исправили уже, и вижу буквально только что 2.0.13 релизнулся:
                        Bug #13564: Fixed yii\web\Request::getAuthUser(), getAuthPassword() to respect HTTP_AUTHORIZATION request header (silverfire)

                        Молодцы, спасибо за фреймворк)
                        • +2
                          Супер! Крутой релиз! Много исправили / добавили всего, чего ожидал) Огромное спасибо за прекрасный фреймфорк и его развитие!
                          • +1
                            Большое спасибо за обновления! Особенно порадовал asset-packagist.org. Любая чистая установка шаблонов «basic» и «advanced» начиналась с правки именно composer.json, затем update, затем удаление ненужной папки bower в vendor и правки конфига.
                            • +1

                              Наконец-то свои таблицы и не нужно тянуть CLImate!
                              Ждём 2.1!

                              • +1
                                Ура! гуглим ошибки в 1 клик :-)
                                • +1
                                  + сразу ищем ответ на stackoverflow )
                                • +1
                                  Отдельная благодарность за консольную таблицу. Этого не хватало в консольных приложениях на yii2.
                                  • 0
                                    Скажите, пожалуйста, yii2.1 будет переписан под 7.1 (я имею ввиду типизацию параметров и тип возвращаемого значения у функций)? Планируется ли покрыть основные компоненты интерфейсами чтобы можно было их красиво заменять через DI? Планируете ли вы, хотя бы частично, поломать связи между компонентами фреймворка? Будет ли заменен boostrap3 на 4?
                                    • 0
                                      Скажите, пожалуйста, yii2.1 будет переписан под 7.1 (я имею ввиду типизацию параметров и тип возвращаемого значения у функций)?

                                      Нет.


                                      Планируется ли покрыть основные компоненты интерфейсами чтобы можно было их красиво заменять через DI?

                                      Да.


                                      Планируете ли вы, хотя бы частично, поломать связи между компонентами фреймворка?

                                      Зависимости? Да.


                                      Будет ли заменен boostrap3 на 4?

                                      Если релизнется. Вообще это к 2.1 не относится. У расширений свои релизы.

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