Yii 2.0.6

Состоялся релиз 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!']
}, 'There are errors!');

Улучшения yii message

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

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

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

Также теперь сортировка происходит даже при отсутствии новых строк, что позволяет получить меньший 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 ($session) {
                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),
                ];
            }
        ],
    ],
];


© Habrahabr.ru