Yii 2.0.7

    Вышла версия 2.0.7 PHP фреймворка Yii. Как установить или обновиться описано на странице http://www.yiiframework.com/download/.

    Данная версия содержит более сотни улучшений и исправлений, уточнения документации и её переводы.

    Для обновления может понадобится выполнить дополнительные действия, описанные в UPGRADE.md.

    Спасибо нашему замечательному сообществу, которое дало нам множество пулл-реквестов и обсуждений. Без вас этого релиза не было бы. Спасибо!

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

    Ну а теперь рассмотрим самые интересные улучшения и исправления этого релиза.

    Валидатор IP



    Новый валидатор может проверять IP на чёткое соответствие, диапазоны и маски. Он может использоваться как отдельный валидатор, так и как часть метода rules() модели:

    public function rules()
    {
        return [
            ['address', 'ip', 'ranges' => [
                 '192.168.10.128'
                 '!192.168.10.0/24',
                 'any' // все остальные адреса
            ]],
        ];
    }
    


    Подробнее возможности валидатора описаны в руководстве, комментариях к классу и
    тестах.

    i18n



    Форматтер обзавёлся новым методом asDuration(), который позволяет получить читабельную строку из интервала времени, представленного объектом DateInterval, количеством секунд или строкой ISO8601:

    echo Yii::$app->formatter->asDuration(131);
    // выведет "2 minutes, 11 seconds"
    


    Теперь через yii\i18n\Formatter::$calendar можно выбрать, по какому календарю форматировать даты. Например, вот так можно использовать Персидский календарь:

    Yii::$app->formatter->locale = 'fa_IR@calendar=persian';
    Yii::$app->formatter->calendar = \IntlDateFormatter::TRADITIONAL;
    Yii::$app->formatter->timeZone = 'UTC';
    $value = 1451606400; // Fri, 01 Jan 2016 00:00:00 (UTC)
    echo Yii::$app->formatter->asDate($value, 'php:Y');
    // выведет "۱۳۹۴"
    


    Подробное описание можно найти в документации к классу.

    Кроме того, транслитерация вне контекста URL теперь доступна как Inflector::transliterate(), что полезно для генерации ключевых слов и других метаданных при разработке под такие языки, как вьетнамский.

    Базы данных



    Помимо исправлений в релиз были включены и несколько интересных улучшений. В Query::groupBy() и Query::orderBy() теперь можно использовать yii\db\Expression:

    $expression = new Expression('SUBSTR(name, 2)');
    $users = (new \yii\db\Query)
        ->from('user')
        ->orderBy($expression)
        ->limit(10)
        ->all();
    


    Для SQLite стало возможным использование псевдонимов в DSN:

    'db' => [
        'dsn' => 'sqlite:@app/db/database.sqlite3',
    ]
    


    Для JOIN с связанными записями в Active Record появился упрощённый способ именовать таблицы. Синтаксис, доступный ранее в join(), теперь можно использовать и в joinWith():

    // join-им с заказами и сортируем результат по orders.id
    $query->joinWith(['orders o'])->orderBy('o.id');
    


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



    Новый синтаксис миграций, введённый в 2.0.6, получил несколько улучшений. Во-первых, это поддержка unsigned:

    'createdBy' => $this->integer(10)->unsigned(),
    


    Во-вторых, теперь можно использовать выражения в качестве значений по умолчанию:

    $this->integer()->defaultExpression('CURRENT_TIMESTAMP');
    


    Консольный генератор миграций



    Команда ./yii migrate/create стала умнее. На основе имени создаваемой миграции и параметров она научилась генерировать код самой миграции:

    ./yii migrate/create create_post --fields=title:string,body:text
    


    сгенерирует:

    class m150811_220037_create_post extends Migration
    {
        public function up()
        {
            $this->createTable('post', [
                'id' => $this->primaryKey(),
                'title' => $this->string(),
                'body' => $this->text()
            ]);
        }
    
        public function down()
        {
            $this->dropTable('post');
        }
    }
    


    Синтаксис подробно описан в руководстве. Надеемся, нововведение сбережёт ваше время.

    Расширение интерфейса RBAC



    В интерфейс RBAC было добавлен метод getUserIdsByRole(). Он наверняка будет полезен при разработке админки для ролей и разрешений.

    Обработка и вывод ошибок



    • Добавлена поддержка кодов ошибок PHP 5.5 при обработке JSON. Это позволяет точно определить причину, по которой кодирование в JSON не удалось.
    • VarDumper::dump() научился работать с магическим методом PHP __debugInfo().
    • Обработчик ошибок из соображений безопасности больше не показывает $_ENV и $_SERVER на странице ошибок. Отображаемые данные настраиваются через yii\web\ErrorHandler::$displayVars.
    • yii\helpers\VarDumper::export() научился работать с циклическими ссылками, что делает логирование и отладочную панель более надёжными.
    Метки:
    • +27
    • 18,9k
    • 7
    Поделиться публикацией
    Похожие публикации
    Комментарии 7
    • +1
      За миграции отдельное спасибо!
      • +4
        Для JOIN с связанными записями в Active Record появился упрощённый способ именовать таблицы. Синтаксис, доступный ранее в join(), теперь можно использовать и в joinWith():

        наконец то! больше всего не хватало!
        • 0
          Это да, приходилось использовать полное имя таблицы.
          • 0
            +. У меня сложные запросы на половину исписаны Model::tableName(); Очень удобная штука теперь есть.
          • 0
            Приятно видеть, что фреймворк развивается
            • 0
              А почему изменилась только патч-версия?
              Добавление нового метода в интерфейс — это нарушение обратной совместимости. Должна быть увеличена минорная версия.
              • 0
                Потому что не semver.

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