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() научился работать с циклическими ссылками, что делает логирование и отладочную панель более надёжными.

© Habrahabr.ru