Нам очень приятно сообщить о выходе RC (релиз кандидата) PHP-фреймворка Yii 2.0. Чтобы установить фреймворк или обновиться следуйте инструкциям на yiiframework.com.
В данной версии исправлено около сотни ошибок, сделано более двухсот улучшений и имеются новые возможности. Она является результатом пяти месяцев интенсивной разработки, если считать с беты. В течение этого времени нам активно помогало сообщество фреймворка. Спасибо всем, кто помогал Yii и без кого этот релиз не состоялся бы. Вы лучшие!
Часто задаваемые вопросы
- Что значит 2.0 RC? RC значит Release Candidate, то есть последний релиз перед стабильным GA (General Availability). До него остались, главным образом, правки небольших проблем и документация.
- Когда будет стабильный релиз? Всё зависит от того, какие проблемы будут с RC. Предварительный план — сделать стабильный релиз примерно через две недели. Конечно, если RC покажет себя достаточно стабильным.
- Могу ли я использовать RC в своих проектах? Да. Мы настоятельно рекомендуем попробовать его в новых проектах и будем признательны за сообщения об ошибках и просто отзывы. Так как стабильный релиз будет скоро, мы не советуем использовать RC на боевых серверах потому как, хоть это и маловероятно, в стабильной версии всё ещё может быть поломана обратная совместимость.
- Есть ли документация по 2.0? Да, полное руководство, которое является самой полной документацией по 2.0 и документация по API — справочник, который поможет в использовании отдельных классов фреймворка.
- Как обновиться с 1.1 на 2.0? Читайте Upgrading from Yii 1.1. Сразу отметим, что 2.0 полностью переписан и обновление не является тривиальным. Если ваше приложение на 1.1 работает хорошо и стабильно, рекомендуем продолжать использовать 1.1, если конечно у вас нет дополнительного времени и ресурсов для обновления.
- Как обновиться с беты или альфы 2.0? Читайте инструкции в UPGRADE.
- Как следить за разработкой 2.0? Вся разработка происходит на GitHub: github.com/yiisoft/yii2. Чтобы получать информацию об изменениях, можно отметить проект звёздочкой. Также можете подписаться на наш Twitter twitter.com/yiiframework и присоединиться к группе Facebook.
Главные улучшения в 2.0 RC
В данном релизе имеется большое количество полезных изменений и улучшений. Ниже мы опишем самое важное. Полный список изменений можно найти в CHANGELOG. Если хотите узнать фреймворке в общем, читайте полное рукводство.
Безопасность
Несколько экспертов по безопасности, включая Tom Worster и Anthony Ferrara, помогли нам с проверкой кода фреймворка и передали множество замечаний и предложений. Tom помог переписать часть кода, что позволило улучшить генерацию ключей, использовать более стойкое шифрование, защититься от timing attack и многих других типов атак.
Для более удобной настройки хелпер Security
стал компонентом приложения security
. В результате обращаться к нему можно как Yii::$app->security->encrypt()
.
В дополнение сделан ряд небольших, но важных для безопасности изменений. Например, теперь httpOnly
включен для всех cookie по умолчанию, а CSRF токены можно хранить в сессиях вместо cookie если выставить yiiwebRequest::enableCsrfCookie
в false
.
Работа с базой данных
Репликация и разделение чтения/записи
Репликация и разделение чтения/записи (read-write splitting) теперь поддерживаются ядром фреймворка. При репликации данные реплицируются с master серверов на slave сервера. Вся запись и обновления должны делаться на master серверах, а чтение можно производить со slave серверов. Для использования данной возможности настройте соединение с БД следующим образом:
[
'class' => 'yiidbConnection',
// конфигурация для master
'dsn' => 'dsn for master server',
'username' => 'master',
'password' => '',
// общая конфигурация для slave-ов
'slaveConfig' => [
'username' => 'slave',
'password' => '',
],
// список конфигураций slave-ов
'slaves' => [
['dsn' => 'dsn для slave 1'],
['dsn' => 'dsn для slave 2'],
['dsn' => 'dsn для slave 3'],
],
]
С данной конфигурацией вы можете продолжать писать код как и раньше. Если запрос выбирает данные, автоматически будет использован один из slave-ов (для выбора сервера используется простой алгоритм балансирования нагрузки). Если запрос обновляет или вставляет данные, будет использован master.
Транзакции
Было сделано несколько улучшений на тему транзакций.
Во первых, вы можете работать с транзакциями в стиле callback-ов:
$connection->transaction(function() {
$order = new Order($customer);
$order->save();
$order->addItems($items);
});
Что эквивалентно более длинному коду:
$transaction = $connection->beginTransaction();
try {
$order = new Order($customer);
$order->save();
$order->addItems($items);
$transaction->commit();
} catch (Exception $e) {
$transaction->rollBack();
throw $e;
}
Во вторых, транзакции вызывают несколько событий. Например, событие beginTransaction
вызывается соединением с БД при старте новой транзакции, а commitTransaction
вызывается при удачном коммите. Вы можете использовать эти события для различной пред- и постобработки.
Наконец, можно указывать уровень изоляции транзакции (например, READ COMMITTED
) при её старте:
$transaction = $connection->beginTransaction(Transaction::READ_COMMITTED);
Построение запроса
При построении запроса теперь можно использовать любые операторы. В примере ниже для условия age >= 30
используется оператор >=
. Yii должным образом экранируем имя поля, а для значения использует связывание параметра.
$query = new yiidbQuery;
$query->where(['>=', 'age', 30]);
При построении in
или not
можно использовать подзапросы:
$subquery = (new yiidbQuery)
->select('id')
->from('user')
->where(['>=', 'age', 30]);
// выбираем заказы, которые сделали клиенты старше 30 лет
$orders = (new yiidbQuery)
->from('order')
->where(['in', 'customer_id', $subquery])
->all();
Управление ресурсами
Yii использует пакеты Bower и NPM, то есть jQuery, jQuery UI, Bootstrap, через Composer при помощи замечательного Composer Asset Plugin.
Из за этого изменения необходимо до использования Yii один раз поставить плагин:
php composer.phar global require "fxp/composer-asset-plugin:1.0.0-beta2"
Теперь при помощи следующей команды вы сможете установить пакет Bower jQuery в директорию vendor
:
php composer.phar require bower-asset/jquery:2.1.*
Подробнее о ресурсах написано в полном руководстве.
Форматирование данных
Мы значительно отрефакторили форматтеры данных yiibaseFormatter
и yiii18nFormatter
. Теперь существует только один класс yiii18nFormatter
. Новый форматтер предоставляет единый интерфейс вне зависимости от наличия на сервере PHP расширения intl. Если расширение не установлено, форматирование будет производиться средствами фреймворка и не будет поддерживать интернационализацию.
Также мы стандартизировали форматы даты и времени. Теперь используется, главным образом, формат ICU. Такие классы, как DateValidator
и JUI DatePicker
используют такой формат по умолчанию. Форматы PHP можно использовать через префикс php:
.
$formatter = Yii::$app->formatter;
$value = time();
echo $formatter->asDate($value, 'MM/dd/yyyy'); // эквивалентно date('m/d/Y', $value)
echo $formatter->asDate($value, 'php:Y/m/d'); // эквивалентно date('Y/m/d', $value)
echo $formatter->asDate($value, 'long'); // эквивалентно date('F j, Y', $value)
Формы
Улучшения коснулись и JavaScript компонента ActiveForm
.
Вместо использования callback-ов по ходу выполнения валидации теперь вызываются события. Использовать их довольно просто:
$('#myform').on('beforeValidate', function (event, messages, deferreds) {
// Вызывается до валидации всей формы сразу после нажатия submit.
// Тут можно провести дополнительные проверки.
});
$('#myform').on('beforeSubmit', function () {
// Вызывается после удачной валидации всех полей и до того как форма отправляется на северер.
// Тут можно отправить форму через AJAX. Не забудьте вернуть false для того, чтобы форма не отправлялась как обычно.
});
Также поддерживается отложенная валидация. В примере выше параметр deferreds
для события beforeValidate
позволяет добавить новый объект Deferred. FileValidator
и ImageValidator
теперь поддерживают валидацию на клиенте именно благодаря отложенной валидации.
Некоторые методы в JavaScript коде ActiveForm
стали частью API, что позволяет легче создавать динамичные формы с поддержкой валидации добавляемых полей на стороне клиента. К примеру, следующий JavaScript код может быть использован для валидации только что добавленного поля «address»:
$('#myform').yiiActiveForm('add', {
'id': 'address',
'name': 'address',
'container': '.field-address',
'input': '#address',
'error': '.field-address .help-block'
});
Логирование и обработка ошибок
Вы можете использовать массивы и объекты как данные при логировании. Все включенные по умолчанию в фреймворк цели логов автоматически конвертируют их в текстовое представление. В своём классе цели лога можно обрабатывать такие данные специальным образом.
InvalidCallException
, InvalidParamException
, UnknownMethodException
теперь наследуются от BadMethodCallException
из SPL, что делает иерархию исключений более логичной.
При отображении исключений теперь показываются аргументы методов в стектрейсе.
Инструменты разработчика
Отладчик Yii — очень полезный инструмент, который показывает детальную информацию о ходе выполнение приложения. Мы добавили в него новую панель, которая показывает загруженные бандлы ресурсов и их содержимое.
Генератор кода Gii теперь можно использовать из консоли. Ранее предоставлялся только веб интерфейс, который хоть и очень интуитивен, не нравится хардкорным консольщикам. Теперь довольны должны быть все. Более того, код генераторов не изменился. При создании своего генератора не надо делать двойной работы: и консоль и веб используют один и тот же код.
Чтобы попробовать Gii в консоли, запустите следующие команды:
# перейдите в базовую директорию приложения
cd path/to/AppBasePath
# смотрим справку по Gii
yii help gii
# смотрим справку по генератору моделей
yii help gii/model
# генерируем модель City на основе таблицы city
yii gii/model --tableName=city --modelClass=City
Поведения
Мы добавили новое поведение yiibehaviorsSluggableBehavior
, которое позволяет заполнить определённый атрибут модели транслитерированной готовой к использованию в URL версией строки. Использовать его можно следующим образом:
use yiibehaviorsSluggableBehavior;
public function behaviors()
{
return [
[
'class' => SluggableBehavior::className(),
'attribute' => 'title',
// 'slugAttribute' => 'alias', // храним строку для URL (или slug) в поле "alias"
// 'ensureUnique' => true, // нам нужны только уникальные slug-и
],
];
}
Поведения теперь могут присоединяться анонимно:
$component->attachBehaviors([
'myBehavior1' => new MyBehavior, // именованное поведение
MyBehavior::className(), // анонимное поведение
]);
Шаблонные движки
Расширения Smarty и Twig были существенно улучшены. Для каждого из них был введён специальный синтаксис для многих возможностей Yii, что, судя по отзывам, позволяет работать с Smarty и Twig так же эффективно, как с обычными шаблонами PHP. Подробнее о новом синтаксисе можно узнать в полном руководстве.
Документация на Русском
Документация частично переведена на Русский, но вариант перевода не окончательный и читать её можно либо напрямую с GitHub, либо сгенерировав HTML самостоятельно. Огромное спасибо
русскоязычному сообществу за непосредственное участие в переводе.
Автор: SamDark