Pull to refresh

Yii 2.0 RC

Reading time 7 min
Views 37K
Нам очень приятно сообщить о выходе 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 если выставить yii\web\Request::enableCsrfCookie в false.

Работа с базой данных


Репликация и разделение чтения/записи


Репликация и разделение чтения/записи (read-write splitting) теперь поддерживаются ядром фреймворка. При репликации данные реплицируются с master серверов на slave сервера. Вся запись и обновления должны делаться на master серверах, а чтение можно производить со slave серверов. Для использования данной возможности настройте соединение с БД следующим образом:

[
    'class' => 'yii\db\Connection',

    // конфигурация для 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 \yii\db\Query;
$query->where(['>=', 'age', 30]);


При построении in или not можно использовать подзапросы:

$subquery = (new \yii\db\Query)
    ->select('id')
    ->from('user')
    ->where(['>=', 'age', 30]);

// выбираем заказы, которые сделали клиенты старше 30 лет
$orders = (new \yii\db\Query)
    ->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.*


Подробнее о ресурсах написано в полном руководстве.

Форматирование данных


Мы значительно отрефакторили форматтеры данных yii\base\Formatter и yii\i18n\Formatter. Теперь существует только один класс yii\i18n\Formatter. Новый форматтер предоставляет единый интерфейс вне зависимости от наличия на сервере 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


Поведения


Мы добавили новое поведение yii\behaviors\SluggableBehavior, которое позволяет заполнить определённый атрибут модели транслитерированной готовой к использованию в URL версией строки. Использовать его можно следующим образом:

use yii\behaviors\SluggableBehavior;

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 самостоятельно. Огромное спасибо
русскоязычному сообществу за непосредственное участие в переводе.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+42
Comments 78
Comments Comments 78

Articles