http://habrahabr.ru/post/240149/
После трёх лет интенсивной разработки и почти
10000 коммитов более
300 авторов вышла стабильная версия PHP фреймворка Yii 2.0! Спасибо за поддержку и терпение!
Как вы, возможно, уже знаете, Yii 2.0 был переписан с нуля. Это решение было принято, так как мы хотели получить отличный PHP фреймворк, который сохранит простоту и расширяемость Yii и, в то же время, будет использовать свежие технологии и возможности, чтобы стать ещё лучше. Сегодня мы рады сообщить, что цель достигнута.
Немного полезных ссылок про Yii и Yii 2.0:
Далее мы рассмотрим самые интересные возможности новой версии. Если вы спешите попробовать фреймворк в деле, начните с чтения раздела руководства
Getting Started.
Самое интересное
Следование стандартам и использование последних технологий
Yii 2.0 использует пространства имён и трейты PHP,
стандарты PSR,
Composer и
Bower. Всё это делает работу с фреймворком более приятной. Сторонние библиотеки теперь использовать намного проще.
Надёжная основа
Как и в 1.1, в Yii 2.0 поддерживаются
свойства объектов через геттеры и сеттеры,
конфигурации,
события и
поведения. Новый код более эффективен и выразителен. К примеру, обработать событие вы можете следующим образом:
$response = new yii\web\Response;
$response->on('beforeSend', function ($event) {
// обрабатываем событие "beforeSend"
});
В Yii 2.0 реализованы
dependency injection container и
service locator. При правильном использовании они делают приложения более гибкими и тестируемыми.
Инструменты для разработки
В Yii 2.0 включены несколько инструментов, которые облегчают разработчикам жизнь.
Отладчик Yii позволяет изучать детали работы вашего приложения. Он также может использоваться для профилирования производительности и поиска узких мест.
Как и в версии 1.1, в Yii 2.0 есть существенно экономящий время
генератор кода Gii. Он отлично расширяется, что позволяет создавать свои генераторы. Работать с Gii можно как из браузера, так и из консоли.
Документация по API Yii 1.1 получила немало хвалебных отзывов. Многие хотели такой же документации для своих проектов, поэтому в Yii 2.0 включён
генератор документации. Он поддерживает Markdown, что позволяет писать более лаконично и выразительно.
Безопасность
Yii 2.0 помогает вам писать более безопасный код. В фреймворке имеются возможности для предотвращения SQL инъекций, XSS атак, CSRF атак, подделки cookie и т.д. Некоторые части кода были проверены экспертами по безопасности
Tom Worster и
Anthony Ferrara и впоследствии переписаны.
Базы данных
Работа с базами данных никогда не была такой простой. В Yii 2.0 поддерживаются
миграции,
DAO,
построитель запросов и
Active Record. Если сравнивать с 1.1, в версии 2.0 улучшена производительность Active Record, а синтаксис для работы с ним такой же, как и при работе с построителем запросов. Ниже показано получение данных клиента при помощи построителя запросов и Active Record. В обоих случаях используется цепочка вызова методов, напоминающая SQL.
use yii\db\Query;
use app\models\Customer;
$customers = (new Query)->from('customer')
->where(['status' => Customer::STATUS_ACTIVE])
->orderBy('id')
->all();
$customers = Customer::find()
->where(['status' => Customer::STATUS_ACTIVE])
->orderBy('id')
->asArray();
->all();
Следующий код показывает выборки связанных данных через Active Record:
namespace app\models;
use app\models\Order;
use yii\db\ActiveRecord;
class Customer extends ActiveRecord
{
public static function tableName()
{
return 'customer';
}
// задаёт связь типа one-to-many с моделью Order
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
}
}
// возвращает клиента с id равным 100
$customer = Customer::findOne(100);
// возвращает заказы клиента
$orders = $customer->orders;
Ниже мы обновляем запись о клиенте. При этом используется связывание параметров, что практически исключает возможность SQL инъекции. В базу сохраняются только изменённые данные.
$customer = Customer::findOne(100);
$customer->address = '123 Anderson St';
$customer->save(); // выполнит SQL: UPDATE `customer` SET `address`='123 Anderson St' WHERE `id`=100
Yii 2.0 поддерживает множество баз данных. Помимо традиционно используемых реляционных баз добавлена поддержка Cubrid, ElasticSearch и Sphinx. Также поддерживаются и NoSQL хранилища, такие как Redis и MongoDB. Для доступа ко всем этим базам данных, как через построитель запросов, так и через Active Record используется тот же самый API, что позволяет легко перейти от использования одного хранилища, к использованию другого. При использовании Active Record можно строить связи между данными из разных баз (например, между MySQL и Redis).
Для приложений с большими базами и высокими требованиями к производительности в Yii 2.0 реализована поддержка
репликации БД и разделение чтения/записи.
RESTful API
Yii позволяет получить рабочий и совместимый с последними протоколами
RESTful API написав всего пару строчек кода. Пример ниже показывает создание RESTful API для данных пользователя.
Сначала создаём контроллер
app\controllers\UserController
и указываем
app\models\User
в качестве модели данных:
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
}
Далее изменяем конфигурацию компонента
urlManager
так, чтобы использовать красивые URL:
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
Готово! API, который был только что создан, поддерживает:
GET /users
: список всех пользователей с постраничной разбивкой;
HEAD /users
: заголовки с информацией о списке пользователей;
POST /users
: создаёт нового пользователя;
GET /users/123
: информация о пользователе с id = 123;
HEAD /users/123
: заголовки с информацией о пользователе с id = 123;
PATCH /users/123
и PUT /users/123
: обновляет информацию пользователя с id = 123;
DELETE /users/123
: удаляет пользователя с id = 123;
OPTIONS /users
: возвращает поддерживаемые глаголы HTTP для /users
;
OPTIONS /users/123
: возвращает поддерживаемые глаголы HTTP для /users/123
.
Попробовать API можно при помощи
curl
:
$ curl -i -H "Accept:application/json" "http://localhost/users"
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
X-Powered-By: PHP/5.4.20
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
[
{
"id": 1,
...
},
{
"id": 2,
...
},
...
]
Кеширование
Как и в версии 1.1, в Yii 2.0 отличная поддержка кеширования как на стороне сервера (
фрагменты,
запросы), так и на стороне клиента (
HTTP). Есть драйверы для многих хранилищь, в том числе APC, Memcache, файлы, базы данных и т.д.
Формы
В Yii 1.1 можно быстро создать HTML формы с поддержкой как клиентской, так и серверной валидации. Во второй версии
сделать это ещё проще. В примере ниже показано создание формы логина.
Сначала создаётся модель
LoginForm
, которая представляет собираемые из формы данные. В модели указываются правила валидации, которые будут автоматически использованы для генерации необходимого для валидации на клиенте JavaScript.
use yii\base\Model;
class LoginForm extends Model
{
public $username;
public $password;
/**
* @return array the validation rules.
*/
public function rules()
{
return [
// username and password are both required
[['username', 'password'], 'required'],
// password is validated by validatePassword()
['password', 'validatePassword'],
];
}
/**
* Validates the password.
* This method serves as the inline validation for password.
*/
public function validatePassword()
{
$user = User::findByUsername($this->username);
if (!$user || !$user->validatePassword($this->password)) {
$this->addError('password', 'Incorrect username or password.');
}
}
}
Далее создаём view:
use yii\helpers\Html;
use yii\widgets\ActiveForm;
<?php $form = ActiveForm::begin() ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= Html::submitButton('Login') ?>
<? ActiveForm::end() ?>
Аутентификация и авторизация
Как и в версии 1.1, в Yii 2.0 есть встроенная возможность аутентификации и авторизации пользователя. Поддерживаются вход, выход,
аутентификация на основе cookie и токена,
фильтр контроля доступа и
контроль доступа на основе ролей (RBAC).
Также есть возможность
входа через внешние сервисы по OpenID, OAuth1 и OAuth2. Есть и готовая поддержка популярных сервисов, таких как Facebook, GitHub, Google, Twitter, Вконтакте и Яндекс.
Виджеты
Для построения интерактивных пользовательских интерфейсов в состав фреймворка включено довольно много готовых элементов, называемых
виджетами. Есть поддержка виджетов
Bootstrap и
jQuery UI. Помимо этого, предоставляются такие часто используемые элементы как постраничная разбивка, грид, список и т.д. Все они делают разработку веб приложения действительно быстрым и приятным процессом. Например, используя следующий код можно получить полностью рабочий элемент jQuery UI для выбора даты на русском:
use yii\jui\DatePicker;
echo DatePicker::widget([
'name' => 'date',
'language' => 'ru',
'dateFormat' => 'yyyy-MM-dd',
]);
Хелперы
Для упрощения частых задач в фреймворке имеются
хелперы. Например, в хелпере
Html
собраны методы для создания различных тегов HTML а хелпер
Url
позволяет создавать различные URL:
use yii\helpers\Html;
use yii\helpers\Url;
// создаёт список чекбоксов со странами
echo Html::checkboxList('country', 'USA', $countries);
// выводит URL "/index?r=site/index&src=ref1#name"
echo Url::to(['site/index', 'src' => 'ref1', '#' => 'name']);
Интернационализация
Так как фреймворк используется по всему миру, мы позаботились о хорошей поддержке интернационализации. Поддерживаются
перевод сообщений и
перевод view, основанные на локали
множественные формы и форматирование данных по
стандарту ICU. Например:
// переводим сообщение с форматированием даты
echo \Yii::t('app', 'Today is {0, date}', time());
// переводим сообщение с множественными формами
echo \Yii::t('app', 'There {n, plural, =0{are no cats} =1{is one cat} other{are # cats}}!', ['n' => 0]);
Шаблонизаторы
По умолчанию Yii 2.0 использует в качестве языка шаблонов PHP, но также поддерживает
Twig и
Smarty через
специальные расширения. Возможно создавать и свои расширения для поддержки других шаблонизаторов.
Тестирование
Yii 2.0 официально поддерживает интеграцию с
Codeception и
Faker. В состав фреймворка включено решение для фикстур через миграции, что делает работу с данными для тестов более удобной.
Шаблоны приложений
Для того, чтобы сделать разработку ещё быстрее, в релиз вошли два шаблона приложений, каждый из которых представляет собой полностью рабочее веб приложение.
Шаблон basic рекомендуется использовать как основу для небольших относительно простых веб проектов, таких как порталы и персональные сайты.
Шаблон advanced больше подходит для крупных приложений с разделением на множество серверов, разрабатываемых большой командой.
Расширения
Несмотря на то, что Yii 2.0 предоставляет много полезных возможностей, в нём реализована система расширений, что делает его ещё более мощным. Расширениями называются распространяемые отдельно пакеты, специально предназначенные для использования в приложениях Yii. Множество возможностей Yii уже вынесены в расширения, например
отсылка почты и
Bootstrap. На сайте Yii представлена большая
пользовательская библиотека, насчитывающая на данный момент почти 1700 расширений. На
packagist.org можно найти более 1300 пакетов для Yii.
Начало работы
Для начала работы введите следующие команды:
# устанавливаем composer-asset-plugin глобально. Это нужно сделать один раз.
php composer.phar global require "fxp/composer-asset-plugin:1.0.0-beta2"
# устанавливаем шаблон приложения basic
php composer.phar create-project yiisoft/yii2-app-basic basic 2.0.0
Команды выше сработают, если у вас уже установлен
Composer. Если это не так,
стоит его установить.
Стоит отметить, что в процессе установки Composer может потребовать логин и пароль от GitHub для генерации токена, который позволяет преодолеть ограничения на количество запросов к API.
После выполнения команд выше вы можете начинать работать с веб приложением, доступным по URL
http://localhost/basic/web/index.php
.
Обновляемся
Если вы обновляетесь с предыдущих версий Yii 2.0 (альфа, бета или RC),
следуйте инструкциям.
Обновление с версии 1.1 без переписывания кода приложения невозможно так как Yii 2.0 был полностью переписан и изменений синтаксиса очень много. Тем не менее, многие идеи сохранены, так что работать с 2.0, зная 1.1, будет проще. Большие изменения по сравнению с версией 1.1 подробно описаны в
документации.
Документация
Для Yii 2.0 доступно
полное руководство и
документация по API. Руководство переводится на
множество языков. Переводы будут доступны немного позже. По Yii 2.0
уже вышла одна книга и пишутся ещё. Одна из книг будет написана известным техническим писателем
Larry Ullman, который помогает нам с полным руководством. Александр Макаров координирует и редактирует
книгу рецептов Yii 2.0, похожую на тепло принятую книгу рецептов Yii 1.1.
Спасибо
Спасибо
всем, кто принимал и принимает участие в разработке Yii.
Ваша поддержка неоценима!