Состоялся релиз PHP фреймворка Yii версии 2.0.11. Инструкции по обновлению и установке можно найти на официальном сайте http://www.yiiframework.com/download/.
Версия 2.0.11 содержит более 110 улучшений и исправлений.
Четыре небольших изменения могут затронуть существующие приложения, так что стоит обратить внимание на UPGRADE.md.
Огромное спасибо нашему замечательному сообществу. Мы сделали это вместе!
За процессом разработки Yii 2 можно следить поставив звёздочку на GitHub. Также у нас есть Twitter и Facebook.
Так как уже ведутся работы над Yii 2.1, убедитесь, что версия фреймворка в composer.json
прописана как ~2.0.11
. В противном случае после релиза 2.1 проект может поломаться.
Далее мы рассмотрим самые интересные изменения и улучшения, вошедшие в релиз. Полный список доступен в CHANGELOG.
Покрытие тестами
Мы решили не принимать pull request-ы без тестов за редким исключением. Это должно улучшить качество кода и уменьшить время, затрачиваемое на его проверку. Более половины pull request-ов для 2.0.11 были приняты согласно этому решению.
Некоторые тесты, такие как тесты для менеджера URL, подверглись значительному рефакторингу. Методы стали меньше, читать их стало проще.
Алексей Рогачёв проделал значительную работу по рефакторингу, исправлению и покрытию тестами JavaScript-части фреймворка.
Консоль
В консоли Bash и Zsh стало довольно просто организовать дополнение для команды ./yii
. Настройка описана в руководстве.
Кроме того, при описках консоль подсказывает существующие команды с похожим написанием.
Кеш
Стало возможным выставить глобально длительность хранения данных в кеше через yiicachingCache::$defaultDuration
.
Появился удобный синтаксис:
$data = $cache->getOrSet($key, function () {
return $this->calculateSomething();
});
Код выше делает то же, что и:
$data = $cache->get($key);
if ($data === false) {
$data = $this->calculateSomething();
$cache->set($key, $data);
}
Конфигурация
После продолжительных обсуждений было решено добавить возможность настраивать контейнер зависимостей через основную конфигурацию приложения:
$config = [
'id' => 'basic',
// ...
'container' => [
'definitions' => [
'yiiwidgetsLinkPager' => ['maxButtonCount' => 5]
],
'singletons' => [
],
],
];
Подробнее об этой возможности можно прочитать в разделе «application configurations» официального руководства.
Ещё немного удобства и синтаксиса
С каждым релизом, чтобы сделать разработку приятней, мы пытаемся сделать ошибки всё более полезными и точными. 2.0.11 не исключение. Теперь ошибка при попытке обратиться к несуществующему компоненту сообщает, что именно это и случилось. Ранее фреймворк ругался на невозможность автоматической загрузки класса.
К контроллер добавлены для метода: asJson()
и asXml()
. Служат они для отдачи данных в формате JSON и XML соответственно.
Производительность
- Yii избавился от запросов с условиями вида
0=1
, которые использовались для связей в AR. - RBAC научился пропускать рекурсивные проверки если роли не присвоены какие-либо разрешения.
- Валидатор unique теперь выбирает только первичные ключи, а не полный набор данных.
Ещё одно улучшение напрямую не влияет на производительность, но определённо поможет её увеличить в приложениях. Мы начали логировать использование памяти и процесс сопоставления роутов. Ожидайте соответствующих панелей в следующем релизе модуля debug.
Базы данных
В yiidbQuery
добавлены три новых метода: filterHaving()
, andFilterHaving()
и orFilterHaving()
. Они похожи на остальные методы filter*
, которые добавляют условие только если значение не пусто и обычно используются для различных фильтров.
Класс yiidbConnection
стало приятнее использовать в случае с конфигурациями master-slave:
- Добавлена опция
shuffleMasters
, при помощи которой можно отключить случайный выбор master-соединения. - Добавлен метод
getMaster()
и свойствоmaster
. Они позволяют получить текущее активное master-соединение.
yiidbQuery
теперь можно передавать в insert()
как напрямую вторым аргументом, так и в качестве значения одного из параметров:
$db = Yii::$app->db;
// вставляем query
$sourceQuery = new yiidbQuery()
->select([
'title',
'content',
])->from('{{post_queue}}');
$command = $db->createCommand();
$command->insert('{{post}}', $sourceQuery);
// используем query как значение
$titleQuery = new yiidbQuery()
->select('title')->from('{{titles}}')->limit(1);
$command = $db->createCommand();
$command->insert('{{post}}', [
'title' => $titleQuery,
'content' => 'Привет!',
]);
Совместимость с PHP 7
Мы постоянно проверяем фреймворк на совместимость с PHP 7. К 2.0.11 мы нашли и исправили проблему, связанную с обработкой ошибок и Throwable
.
Менеджер URL
При генерации URL через UrlManager::createAbsoluteUrl()
, Url::to()
или Url::toRoute()
теперь можно указать схему как пустую для создания протоколо-независимых URL:
echo Url::to('@web/images/logo.gif', '');
// //www.example.com/images/logo.gif
Также при генерации URL стали не обязательными параметры, для которых существуют значения по умолчанию:
echo Url::to(['post/index', 'page' => 1, 'tag' => '']);
// теперь можно так:
echo Url::to(['post/index', 'page' => 1]);
Виджеты
Расширяемость виджетов была значительно улучшена. Добавлены события при инициализации, перед стартом рендеринга и после его завершения. Примеры применения смотрите в описании issue.
Безопасность
В фреймворк было включен фильтр HostControl
, при помощи которого можно предотвратить атаку через подмену хоста. В идеале её лучше не допускать правильной конфигурацией веб-сервера, но так как поступило довольно много запросов от тех, кто не имеет доступа к настройке
сервера, решили всё-таки включить данный фильтр в фреймворк. Детально о настройке данного фильтра можно прочитать в руководстве.
Также была найдена и исправлена проблема с экранированием данных на странице ошибки в режиме отладки. Так как проблема не затрагивает рабочие сервера, мы не стали выпускать отдельный патч-релиз.
Инсталлятор Composer
Вместе с релизом фреймворка мы выпускаем новую версию 2.0.5 инсталлера Composer. Этот плагин для Composer отвечает за установку расширений и позволяет обходиться без конфигурации в процессе бутстрапинга. Также он выполняет разные задачи при создании нового проекта. Благодаря Robert Korulczyk, стало возможно выполнять задачи и при composer install
, что особенно важно для обработки локальных файлов конфигурации, которые теперь можно копировать при помощи нового метода copyFiles
. Более детально можете почитать в README.
Также плагин начал при обновлении пакета yiisoft/yii2
уведомлять о важных изменениях из UPGRADE.md.
Подписанные коммиты и теги
Это первый релиз, с подписанным GPG тегом, что позволяет проверить, что он сделан командой Yii. Позже мы опубликуем детальные инструкции по проверке.
На GitHub подписанные теги можно отличить по надписи "verified": https://github.com/yiisoft/yii2-framework/releases/tag/2.0.11.
Автор: SamDark