Состоялся релиз PHP-фреймворка версии 2.0.8 Yii. Инструкции по обновлению и установки, можно найти на странице
http://www.yiiframework.com/download/.
Версия 2.0.8 содержит около 100 небольших исправлений и улучшений, насчитывает 300 коммитов, от 64 авторов и затрагивает 150 файлов.
Для обновления могут потребоваться дополнительные действия, так что стоит обратиться к UPGRADE.md.
Спасибо нашему замечательному сообществу за отличные идеи и pull request-ы. Этот релиз состоялся благодаря вам!
За процессом разработки фреймворка можно следить на GitHub. Также подписывайтесь на наш Twitter и вступайте в группу в Facebook.
Ниже мы рассмотрим самые интересные изменения этого релиза. Полный список изменений можно найти в CHANGELOG.
Совместимость с PHP 7
Yii 2.0.8 получил пару исправлений на эту тему. Одно касается обработки ошибок в общем, второе — обработке ошибок JSON.
Как вы, скорее всего, уже знаете, PHP 7 в этом году станет довольно распространённым потому как в свежей Ubuntu LTS доступна пакетом именно эта версия.
Базы данных и ActiveRecord
Метод для фильтрации провайдера для GridView из Yii 1.1 появился в Yii 2.0 в виде yii\db\Query::andFilterCompare()
.
Документация не поспела. Будем рады помощи в её написании.
В ActiveRecord теперь вызывают EVENT_AFTER_REFRESH
после того, как модель обновляет свои данные из базы.
Схема и миграции
Благодаря сообществу, в этот релиз вошли улучшения билдера схемы базы данных, который обычно используют в миграциях.
Во-первых, теперь есть возможность добавлять комментарии таблицам и столбцам. При определении столбца делается это вот так:
'title' => $this->string()->notNull()->comment('Hello, I am the title!'),
Отдельными методами пользоваться можно вот так:
$this->addCommentOnTable('user', 'This is a table comment.');
$this->addCommentOnColumn('user', 'name', 'This is a column comment.');
$this->dropCommentFromColumn('user', 'name');
$this->dropCommentFromTable('user');
Стало возможно задать порядок создаваемого столбца:
$this->string()->notNull()->first();
$this->string()->notNull()->after('anotherColumn');
Теперь объявлять unsigned первичные ключи намного приятнее: $this->primaryKey()->unsigned()
.
Консольная команда ./yii migrate/create
также была немного улучшена. Во-первых, появилась опция useTablePrefix
. Если её задать в true
, будут генерироваться код с префиксами таблиц.
Во-вторых, можно генерировать внешние ключи через --fields
:
yii migrate/create create_post --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text"
Формы и валидация
Вы когда-нибудь забывали задать форме нужный enctype для загрузки файлов? Больше не забудете. Yii добавит его автоматически если в Active Form будет использован fileInput
.
В правилах валидации теперь можно сделать поле валидируемым, но, в то же время, недоступным для массового присваивания добавив к началу его имени восклицательный знак.
При использовании FileValidator можно задать mimeTypes
используя wildcard-паттерн. Например, image/*
будет означать все типы, начинающиеся с image/
(image/jpeg
, image/png
и т.д.).
DateValidator научился валидировать ещё больше форматов времени. Теперь можно выставить $type property в TYPE_DATETIME
или TYPE_TIME
для валидации коротких форматов intl.
Безопасность
Благодаря исследованию Tom Worster и продуктивным обсуждениям, которые за ним последовали, компонент Security удалось улучшить:
- Теперь он не читает больше данных, чем реально необходимо, из
/dev/urandom
и/dev/random
. - На FreeBSD предпочтение отдаётся
/dev/random
, а не/dev/urandom
. - Повышена производительность генерации случайных чисел.
Изменения не критичные, так что обновляться на 2.0.8 сломя голову не обязательно.
Тесты для компонента также были переработаны, так что покрытие на разных системах при разных доступных расширениях теперь намного лучше.
Консольные команды
В дополнение к существующим опциям теперь для большинства опций можно использовать короткие алиасы-флаги. К примеру, при создании миграций можно использовать
./yii migrate/create -p=@app/modules/somemodule/migrations -t=module_migrations new_migration
вместо
./yii migrate/create --migrationPath=@app/modules/somemodule/migrations --migrationTable=module_migrations new_migration
В своих собственных контроллерах реализовать это можно перекрыв метод yii\console\Controller::optionAliases()
.
Внедрение зависимостей в анонимные функции в конфигах
Зависимости теперь автоматически внедряются в замыкания, используемые в конфигурации:
'components' => [
'pheanstalk' => function(yii\web\User $user) {
$result = new \Pheanstalk\Pheanstalk('localhost');
$result->watch($user->getId());
return $result;
},
// ...
PostgreSQL mutex
Появилась реализация Mutex под PostgreSQL. Если вы пользуетесь данной СУБД, у вас появился ещё один вариант реализации блокировки.
Шаблон проекта advanced
В шаблоне проекта advanced появилась конфигурация для vagrant, позволяющая быстро поднять рабочее окружение.
Подробнее о ней можно узнать из документации.
Комментарии (29)
bethrezen
29.04.2016 01:40+10Заметка для тех, кто боится использовать Yii2 и php7 — не бойтесь.
Мы используем со времён php 7.0.0 — полёт успешный, а этот релиз yii2 только придал уверенности в правильности перехода на семёрку. На боевых и посещаемых сайтах не встречали даже segfault, хотя коллеги замечали пару раз на dev-серверах.
Прирост в производительности php7 ощутим и на yii2 в том числе — TTFB в среднем на 30% меньше, потребление памяти на ~40% меньше. Статистика по e-commerce проектам(php7 vs php56), примерная. Если нужна конкретика — соберём, покажем.
В общем и целом по фреймворку наблюдаем хороший тренд — правильно оформленные и дельные пул-реквесты в последнее время принимаются на удивление быстро и без лишней бюрократии, что не может не радовать.SamDark
29.04.2016 01:55+3Когда в описании всё чётко и по делу и есть тесты, на проверку уходит не очень много времени. Поэтому быстро и без бюрократии...
yujin1st
29.04.2016 08:29Сокращения к консольным командам — это просто удобно! Спасибо!
Но можно спросить глупый вопрос: зачем нужна gii генерация из консоли? Помнить параметры, дольше исправлять ошибки, дольше набирать — зачем, когда все есть наглядно в веб-версии? Единственно на ум приходит автоматизированная генерация кода для систем где можно создавать сущности на лету… но какие это?habrjeka
29.04.2016 09:10+2Мне вот очень зашло:
php yii migrate/create create_user --fields="username:string(255):notNull(),email:string():notNull()" // проверяем, поправляем код миграции в файле php yii migrate php yii gii/model --modelClass="User" --tableName="user" --ns="backend\models" // поправляем, проверяем код модели в файле php yii gii/crud --controllerClass="backend\controllers\UserController" --modelClass="backend\models\User" // Теперь осталось код чуточку подправить и показать PM ;)
Скелет CRUD приложения для вашей модельки готов, который вполне работает. При этом не надо было запускать браузер и "программировать мышкой".
yujin1st
29.04.2016 10:35Просто ту же миграцию быстрее имхо удобнее писать с автодополнением от ide. А браузер он и так открыт всегда =)
Понятно, что тема чисто субъективная и просто каждый привык к своему.
moicirk
29.04.2016 11:51-1Многие закрывают доступ к модулю через веб из соображений безопасности. При этом разработчики всё ещё могут пользовать это через консоль. Как по мне вполне лоигчно.
yujin1st
29.04.2016 15:09+2А зачем gii в том месте где есть доступ других людей?! Так, например в том же advanced модуль подключается только в main-local на рабочем компьютере.
artem90
30.04.2016 08:54Осмелюсь поделиться своей поделкой, может кому-нибудь да пригодится:
Генератор файла миграции на основе аннотаций модели.
https://github.com/Doka-NT/yii2-migration-generator
Так уж сложилось, что мне удобнее сначала описывать класс, и на его основе строить схему бд.
pzotov
02.05.2016 18:52А из composer'а невозможно установить ни basic, ни advanced
SamDark
02.05.2016 20:46Почему?
pzotov
02.05.2016 20:57http://joxi.ru/LmG51lpSRjY56A
SamDark
02.05.2016 21:43А, ну это потому как надо делать как в гайде написано:
composer global require "fxp/composer-asset-plugin:~1.1.1" composer create-project --prefer-dist yiisoft/yii2-app-basic basic
gogolinsky
Очень удобно стало $this->string()->notNull()->after('anotherColumn');
Спасибо за обновление!