- PVSM.RU - https://www.pvsm.ru -

Yii 2.0. Релиз

После трёх лет интенсивной разработки и почти 10000 коммитов [1] более 300 авторов [2] вышла стабильная версия PHP фреймворка Yii 2.0! Спасибо за поддержку и терпение!

Как вы, возможно, уже знаете, Yii 2.0 был переписан с нуля. Это решение было принято, так как мы хотели получить отличный PHP фреймворк, который сохранит простоту и расширяемость Yii и, в то же время, будет использовать свежие технологии и возможности, чтобы стать ещё лучше. Сегодня мы рады сообщить, что цель достигнута.

Немного полезных ссылок про Yii и Yii 2.0:

Далее мы рассмотрим самые интересные возможности новой версии. Если вы спешите попробовать фреймворк в деле, начните с чтения раздела руководства Getting Started [8].

Самое интересное

Следование стандартам и использование последних технологий

Yii 2.0 использует пространства имён и трейты PHP, стандарты PSR [9], Composer [10] и Bower [11]. Всё это делает работу с фреймворком более приятной. Сторонние библиотеки теперь использовать намного проще.

Надёжная основа

Как и в 1.1, в Yii 2.0 поддерживаются свойства объектов [12] через геттеры и сеттеры, конфигурации [13], события [14] и поведения [15]. Новый код более эффективен и выразителен. К примеру, обработать событие вы можете следующим образом:

$response = new yiiwebResponse;
$response->on('beforeSend', function ($event) {
    // обрабатываем событие "beforeSend"
});

В Yii 2.0 реализованы dependency injection container [16] и service locator [17]. При правильном использовании они делают приложения более гибкими и тестируемыми.

Инструменты для разработки

В Yii 2.0 включены несколько инструментов, которые облегчают разработчикам жизнь.

Отладчик Yii [18] позволяет изучать детали работы вашего приложения. Он также может использоваться для профилирования производительности и поиска узких мест.

Как и в версии 1.1, в Yii 2.0 есть существенно экономящий время генератор кода Gii [19]. Он отлично расширяется, что позволяет создавать свои генераторы. Работать с Gii можно как из браузера, так и из консоли.

Документация по API Yii 1.1 получила немало хвалебных отзывов. Многие хотели такой же документации для своих проектов, поэтому в Yii 2.0 включён генератор документации [20]. Он поддерживает Markdown, что позволяет писать более лаконично и выразительно.

Безопасность

Yii 2.0 помогает вам писать более безопасный код. В фреймворке имеются возможности для предотвращения SQL инъекций, XSS атак, CSRF атак, подделки cookie и т.д. Некоторые части кода были проверены экспертами по безопасности Tom Worster [21] и Anthony Ferrara [22] и впоследствии переписаны.

Базы данных

Работа с базами данных никогда не была такой простой. В Yii 2.0 поддерживаются миграции [23], DAO [24], построитель запросов [25] и Active Record [26]. Если сравнивать с 1.1, в версии 2.0 улучшена производительность Active Record, а синтаксис для работы с ним такой же, как и при работе с построителем запросов. Ниже показано получение данных клиента при помощи построителя запросов и Active Record. В обоих случаях используется цепочка вызова методов, напоминающая SQL.

use yiidbQuery;
use appmodelsCustomer;

$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 appmodels;

use appmodelsOrder;
use yiidbActiveRecord;

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 реализована поддержка репликации БД и разделение чтения/записи [27].

RESTful API

Yii позволяет получить рабочий и совместимый с последними протоколами RESTful API [28] написав всего пару строчек кода. Пример ниже показывает создание RESTful API для данных пользователя.

Сначала создаём контроллер appcontrollersUserController и указываем appmodelsUser в качестве модели данных:

namespace appcontrollers;

use yiirestActiveController;

class UserController extends ActiveController
{
    public $modelClass = 'appmodelsUser';
}

Далее изменяем конфигурацию компонента urlManager так, чтобы использовать красивые URL:

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        ['class' => 'yiirestUrlRule', '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 отличная поддержка кеширования как на стороне сервера (фрагменты [29], запросы [30]), так и на стороне клиента (HTTP [31]). Есть драйверы для многих хранилищь, в том числе APC, Memcache, файлы, базы данных и т.д.

Формы

В Yii 1.1 можно быстро создать HTML формы с поддержкой как клиентской, так и серверной валидации. Во второй версии сделать это ещё проще [32]. В примере ниже показано создание формы логина.

Сначала создаётся модель LoginForm, которая представляет собираемые из формы данные. В модели указываются правила валидации, которые будут автоматически использованы для генерации необходимого для валидации на клиенте JavaScript.

use yiibaseModel;

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 yiihelpersHtml;
use yiiwidgetsActiveForm;

<?php $form = ActiveForm::begin() ?>
    <?= $form->field($model, 'username') ?>
    <?= $form->field($model, 'password')->passwordInput() ?>
    <?= Html::submitButton('Login') ?>
<? ActiveForm::end() ?>
Аутентификация и авторизация

Как и в версии 1.1, в Yii 2.0 есть встроенная возможность аутентификации и авторизации пользователя. Поддерживаются вход, выход, аутентификация [33] на основе cookie и токена, фильтр контроля доступа [34] и контроль доступа на основе ролей (RBAC) [35].

Также есть возможность входа через внешние сервисы [36] по OpenID, OAuth1 и OAuth2. Есть и готовая поддержка популярных сервисов, таких как Facebook, GitHub, Google, Twitter, Вконтакте и Яндекс.

Виджеты

Для построения интерактивных пользовательских интерфейсов в состав фреймворка включено довольно много готовых элементов, называемых виджетами [37]. Есть поддержка виджетов Bootstrap [38] и jQuery UI [39]. Помимо этого, предоставляются такие часто используемые элементы как постраничная разбивка, грид, список и т.д. Все они делают разработку веб приложения действительно быстрым и приятным процессом. Например, использую следующий код можно получить полностью рабочий элемент jQuery UI для выбора даты на русском:

use yiijuiDatePicker;

echo DatePicker::widget([
    'name' => 'date',
    'language' => 'ru',
    'dateFormat' => 'yyyy-MM-dd',
]);

Хелперы

Для упрощения частых задач в фреймворке имеются хелперы [40]. Например, в хелпере Html собраны методы для создания различных тегов HTML а хелпер Url позволяет создавать различные URL:

use yiihelpersHtml;
use yiihelpersUrl;

// создаёт список чекбоксов со странами
echo Html::checkboxList('country', 'USA', $countries);

// выводит URL "/index?r=site/index&src=ref1#name"
echo Url::to(['site/index', 'src' => 'ref1', '#' => 'name']);

Интернационализация

Так как фреймворк используется по всему миру, мы позаботились о хорошей поддержке интернационализации. Поддерживаются перевод сообщений [41] и перевод view [42], основанные на локали множественные формы и форматирование данных [43] по стандарту ICU [44]. Например:

// переводим сообщение с форматированием даты
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 [45] и Smarty [46] через специальные расширения [47]. Возможно создавать и свои расширения для поддержки других шаблонизаторов.

Тестирование

Yii 2.0 официально поддерживает интеграцию с Codeception [48] и Faker [49]. В состав фреймворка включено решение для фикстур через миграции, что делает работу с данными для тестов более удобной.

Шаблоны приложений

Для того, чтобы сделать разработку ещё быстрее, в релиз вошли два шаблона приложений, каждый из которых представляет собой полностью рабочее веб приложение. Шаблон basic [50] рекомендуется использовать как основу для небольших относительно простых веб проектов, таких как порталы и персональные сайты. Шаблон advanced [51] больше подходит для крупных приложений с разделением на множество серверов, разрабатываемых большой командой.

Расширения

Несмотря на то, что Yii 2.0 предоставляет много полезных возможностей, в нём реализована система расширений, что делает его ещё более мощным. Расширениями называются распространяемые отдельно пакеты, специально предназначенные для использования в приложениях Yii. Множество возможностей Yii уже вынесены в расширения, например отсылка почты [52] и Bootstrap [53]. На сайте Yii представлена большая пользовательская библиотека [54], насчитывающая на данный момент почти 1700 расширений. На packagist.org [55] можно найти более 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 [10]. Если это не так, стоит его установить [56].

Стоит отметить, что в процессе установки Composer может потребовать логин и пароль от GitHub для генерации токена, который позволяет преодолеть ограничения на количество запросов к API.

После выполнения команд выше вы можете начинать работать с веб приложением, доступным по URL http://localhost/basic/web/index.php.

Обновляемся

Если вы обновляетесь с предыдущих версий Yii 2.0 (альфа, бета или RC), следуйте инструкциям [57].

Обновление с версии 1.1 без переписывания кода приложения невозможно так как Yii 2.0 был полностью переписан и изменений синтаксиса очень много. Тем не менее, многие идеи сохранены, так что работать с 2.0, зная 1.1, будет проще. Большие изменения по сравнению с версией 1.1 подробно описаны в документации [58].

Документация

Для Yii 2.0 доступно полное руководство [59] и документация по API [60]. Руководство переводится на множество языков [61]. Переводы будут доступны немного позже. По Yii 2.0 уже вышла одна книга [62] и пишутся ещё. Одна из книг будет написана известным техническим писателем Larry Ullman [63], который помогает нам с полным руководством. Александр Макаров координирует и редактирует книгу рецептов Yii 2.0 [64], похожую на тепло принятую книгу рецептов Yii 1.1.

Спасибо

Спасибо всем, кто принимал и принимает участие в разработке Yii [2].
Ваша поддержка неоценима!

Автор: SamDark

Источник [65]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/framework/71448

Ссылки в тексте:

[1] 10000 коммитов: https://github.com/yiisoft/yii2/commits/master

[2] 300 авторов: https://github.com/yiisoft/yii2/graphs/contributors

[3] Официальный сайт Yii: http://www.yiiframework.com

[4] Yii 2.0 на GitHub: https://github.com/yiisoft/yii2

[5] Группа на Facebook: https://www.facebook.com/groups/yiitalk/

[6] Twitter: https://twitter.com/yiiframework

[7] yiiframework.ru: http://yiiframework.ru/

[8] Getting Started: http://www.yiiframework.com/doc-2.0/guide-index.html#getting-started

[9] стандарты PSR: http://www.php-fig.org/psr/

[10] Composer: https://getcomposer.org/

[11] Bower: http://bower.io/

[12] свойства объектов: http://www.yiiframework.com/doc-2.0/guide-concept-properties.html

[13] конфигурации: http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html

[14] события: http://www.yiiframework.com/doc-2.0/guide-concept-events.html

[15] поведения: http://www.yiiframework.com/doc-2.0/guide-concept-behaviors.html

[16] dependency injection container: http://www.yiiframework.com/doc-2.0/guide-concept-di-container.html

[17] service locator: http://www.yiiframework.com/doc-2.0/guide-concept-service-locator.html

[18] Отладчик Yii: http://www.yiiframework.com/doc-2.0/guide-tool-debugger.html

[19] генератор кода Gii: http://www.yiiframework.com/doc-2.0/guide-tool-gii.html

[20] генератор документации: https://github.com/yiisoft/yii2/tree/master/extensions/apidoc

[21] Tom Worster: https://github.com/tom--

[22] Anthony Ferrara: https://github.com/ircmaxell

[23] миграции: http://www.yiiframework.com/doc-2.0/guide-db-migrations.html

[24] DAO: http://www.yiiframework.com/doc-2.0/guide-db-dao.html

[25] построитель запросов: http://www.yiiframework.com/doc-2.0/guide-db-query-builder.html

[26] Active Record: http://www.yiiframework.com/doc-2.0/guide-db-active-record.html

[27] репликации БД и разделение чтения/записи: http://www.yiiframework.com/doc-2.0/guide-db-dao.html#replication-and-read-write-splitting

[28] RESTful API: http://www.yiiframework.com/doc-2.0/guide-rest-quick-start.html

[29] фрагменты: http://www.yiiframework.com/doc-2.0/guide-caching-fragment.html

[30] запросы: http://www.yiiframework.com/doc-2.0/guide-caching-data.html#query-caching

[31] HTTP: http://www.yiiframework.com/doc-2.0/guide-caching-http.html

[32] сделать это ещё проще: http://www.yiiframework.com/doc-2.0/guide-input-forms.html

[33] аутентификация: http://www.yiiframework.com/doc-2.0/guide-security-authentication.html

[34] фильтр контроля доступа: http://www.yiiframework.com/doc-2.0/guide-security-authorization.html#access-control-filter

[35] контроль доступа на основе ролей (RBAC): http://www.yiiframework.com/doc-2.0/guide-security-authorization.html#role-based-access-control-rbac

[36] входа через внешние сервисы: https://github.com/yiisoft/yii2-authclient

[37] виджетами: http://www.yiiframework.com/doc-2.0/guide-structure-widgets.html

[38] Bootstrap: http://getbootstrap.com/

[39] jQuery UI: http://jqueryui.com/

[40] хелперы: https://github.com/yiisoft/yii2/tree/master/framework/helpers

[41] перевод сообщений: http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#message-translation

[42] перевод view: http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#views

[43] множественные формы и форматирование данных: http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#advanced-placeholder-formatting

[44] стандарту ICU: http://icu-project.org/apiref/icu4c/classMessageFormat.html

[45] Twig: http://twig.sensiolabs.org/

[46] Smarty: http://www.smarty.net/

[47] специальные расширения: http://www.yiiframework.com/doc-2.0/guide-tutorial-template-engines.html

[48] Codeception: http://codeception.com/

[49] Faker: https://github.com/fzaninotto/Faker

[50] Шаблон basic: http://www.yiiframework.com/doc-2.0/guide-start-installation.html#installing-via-composer

[51] Шаблон advanced: http://www.yiiframework.com/doc-2.0/guide-tutorial-advanced-app.html

[52] отсылка почты: http://www.yiiframework.com/doc-2.0/guide-tutorial-mailing.html

[53] Bootstrap: https://github.com/yiisoft/yii2-bootstrap

[54] пользовательская библиотека: http://www.yiiframework.com/extensions/

[55] packagist.org: https://packagist.org/search/?q=yii

[56] стоит его установить: http://getcomposer.org/doc/00-intro.md#installation-nix

[57] следуйте инструкциям: https://github.com/yiisoft/yii2/blob/master/framework/UPGRADE.md

[58] документации: http://www.yiiframework.com/doc-2.0/guide-intro-upgrade-from-v1.html

[59] полное руководство: http://www.yiiframework.com/doc-2.0/guide-README.html

[60] документация по API: http://www.yiiframework.com/doc-2.0/index.html

[61] множество языков: https://github.com/yiisoft/yii2/tree/master/docs

[62] уже вышла одна книга: https://www.packtpub.com/web-development/web-application-development-yii-2-and-php

[63] Larry Ullman: http://www.larryullman.com/

[64] книгу рецептов Yii 2.0: https://github.com/samdark/yii2-cookbook

[65] Источник: http://habrahabr.ru/post/240149/