Skip to content

Latest commit

 

History

History
495 lines (355 loc) · 32.2 KB

intro-upgrade-from-v1.md

File metadata and controls

495 lines (355 loc) · 32.2 KB

Обновление с версии 1.1

Между версиями 1.1 и 2.0 существует много различий, так как Yii был полностью переписан для версии 2.0. Таким образом, обновление с версии 1.1 не является таким же тривиальным как обновление между минорными версиями. В данном руководстве по обновлению приведены основные различия между двумя версиями.

Если прежде вы не использовали Yii 1.1, вы можете пропустить данный раздел и перейти к разделу [Начало работы][start-installation.md].

Также учтите, что Yii 2.0 включает больше нового функционала, чем тот, который будет описан здесь. Настоятельно рекомендуется, что вы прочтете все руководство, чтобы узнать какой функционал был добавлен. Возможно, что необходимый функционал, который вы до этого разрабатывали сами, теперь является частью фреймворка.

Установка

Yii 2.0 полностью основан на Composer, который де факто является менеджером зависимостей для PHP. Установка фреймворка, также как и расширений, осуществляется через Composer. Более детальные сведения по установке Yii 2.0 приведены в разделе Установка Yii. Сведения о том, как создавать расширения для Yii 2.0 или адаптировать уже имеющиеся расширения для версии 1.1 под версию 2.0, приведены в разделе Создание Расширений.

Требования PHP

Yii 2.0 использует PHP 5.4 или выше, который включает большое количество улучшений по сравнению с версией 5.2, которая использовалась Yii 1.1. Таким образом, существует много различий в языке, которые вы должны принимать во внимание. Ниже приведены основные изменения в PHP:

Пространства имен

Одним из основных изменений в Yii 2.0 является использование пространств имен. Почти каждый класс фреймворка находится в пространстве имен, например, yii\web\Request. Префикс "С" больше не используется в именах классов. Соглашение именования классов следует структуре папки, в которой располагается класс. Например, yii\web\Request означает, что соответсвующий класс находится в файле web/Request.php в папке Yii фреймворка. (Благодаря загрузчику классов Yii, вы можете использовать любой класс фреймворка без необходимости непосредственно подключать его).

Компонент и Объект

В Yii 2.0 класс CComponent из версии 1.1 был разделен на два класса: [[yii\base\Object]] и [[yii\base\Component]]. Класс [[yii\base\Object|Object]] является простым базовым классом, который позволяет использовать геттеры и сеттеры для свойств. Класс [[yii\base\Component|Component]] наследуется от класса [[yii\base\Object|Object]] и поддерживает события и поведения.

Если вашему классу не нужно использовать функционал событий или поведений, вы можете использовать [[yii\base\Object|Object]] в качестве базового класса. В основном это случаи, когда классы представляют собой базовые структуры.

Конфигурация объекта

Класс [[yii\base\Object|Object]] предоставляет единый способ конфигурирования объектов. Любой дочерний класс [[yii\base\Object|Object]] может определить конструктор (если нужно) для своей конфигурации следующим образом:

class MyClass extends \yii\base\Object
{
    public function __construct($param1, $param2, $config = [])
    {
        // ... инициализация до того, как конфигурация будет применена

        parent::__construct($config);
    }

    public function init()
    {
        parent::init();

        // ... инициализация после того, как конфигурация была применена
    }
}

В примере выше, последний параметр конструктора должен быть массивом конфигурации, который содержит пары в формате ключ-значение для инициализации свойств объекта. Вы можете переопределить метод [[yii\base\Object::init()|init()]] для инициализации объекта после того, как конфигурация была применена к нему.

Следуя этому соглашению, вы сможете создавать и конфигурировать новые объекты с помощью массива конфигурации:

$object = Yii::createObject([
    'class' => 'MyClass',
    'property1' => 'abc',
    'property2' => 'cde',
], [$param1, $param2]);

Более детальная информация о конфигурация представлена в разделе Конфигурации объектов.

События

В Yii1, события создавались с помощью объявления метода on (например, onBeforeSave). В Yii2 вы можете теперь использовать любое имя события. Вы возбуждаете ивенты с помощью вызова метода [[yii\base\Component::trigger()|trigger()]].

$event = new \yii\base\Event;
$component->trigger($eventName, $event);

Для прикрепления обработчика события используйте метод [[yii\base\Component::on()|on()]].

$component->on($eventName, $handler);
// To detach the handler, use:
// $component->off($eventName, $handler);

Есть также и другие улучшения в функционале событий. Более детальная информация о конфигурация представлена в разделе События.

Псевдонимы пути

Yii 2.0 расширяет способ использования псевдонимов пути как для файлов и папок, так и для URL. В Yii 2.0 также теперь требуется, чтобы имя псевдонима начиналось с символа @, для разграничения псевдонимов от обычных путей файлов/папок и URL. Например, псевдоним @yii соответствует установочной папке Yii. Псевдонимы пути используются во многих местах кода Yii. Например, [[yii\caching\FileCache::cachePath]] может использовать как псевдоним пути так и обычный путь к папке.

Псевдонимы пути тесно связаны с пространством имен классов. Рекомендуется, что вы определите псевдоним пути для каждого базового пространства имен, таким образом загрузчик классов Yii может использоваться без какой-либо дополнительной конфигурации. Например, потому, что @yii соответствует установочной папке Yii, класс yii\webRequest может быть загружен. Если вы используете сторонние библиотеки, такие как Zend Framework, вы можете также определить псевдоним пути @Zend, который соответствует установочной папке фреймворка. Единожды сделав это, Yii будет способен автоматичеки загружать любой класс Zend Framework.

Более детальная информация о конфигурациях представлена в разделе Псевдонимы пути.

Представления

Одним из основных изменений в Yii2 является то, что специальная переменная $this в представлении, больше не соответствует текущему контроллеру или виджету. Вместо этого, $this теперь соответствует объекту представления, новой возможности введенной в версии 2.0. Объект представления имеет тип [[yii\web\View]], который представляет собой часть представление в шаблоне проектирования MVC. Если вы хотите получить доступ к контроллеру или виджету, то используйте выражение $this->context.

Для рендеринга частичных представлений, теперь исользуется метод $this->render(), а не $this->renderPartial(). Результат вызова метода render теперь должен быть выведен напрямую, т. к render возвращает результат рендеринга, а не отображает его сразу. Например,

echo $this->render('_item', ['item' => $item]);

Кроме использования PHP в качестве основного шаблонизатора, Yii 2.0 также включает официальные расширения для основных популярных шаблонизаторов: Smarty и Twig. Шаблонизатор Prado больше не поддерживается. Для использования данных шаблонизаторов, вам необходимо настроить компонент приложения view с помощью указания свойств [[yii\base\View::$renderers|View::$renderers]].

Более детальная информация представлена в разделе Шаблонизаторы.

Модели

Yii 2.0 использует основной класс [[yii\base\Model]] для моделей, аналогичный классу CModel в версии 1.1. Класс CFormModel более не поддерживается. Вместо этого, для создания модели формы в Yii 2.0 вы должны напрямую наследоваться от класса [[yii\base\Model]].

В Yii 2.0 появился новый метод [[yii\base\Model::scenarios()|scenarios()]] для объявления поддерживаемых сценариев, и для обозначения в каком сценарии атрибуты должны проверяться, считаться безопасными и т. п. Например,

public function scenarios()
{
    return [
        'backend' => ['email', 'role'],
        'frontend' => ['email', '!name'],
    ];
}

В примере выше, объявлено два сценария: backend и frontend. Для backend сценария, оба атрибута email и role являются безопасными, и могут быть массово присвоены. Для сценария frontend, атрибут email может быть массово присвоен, а атрибут role нет. Оба атрибута email и role должны быть проверены с помощью правил валидации.

Метод [[yii\base\Model::rules()|rules()]] по-прежнему используется для объявления правил валидации. Обратите внимание, что в связи с появлением нового метода [[yii\base\Model::scenarios()|scenarios()]], больше не поддерживается валидатор unsafe.

В большинстве случаев вам не нужно переопределять метод [[yii\base\Model::scenarios()|scenarios()]], если метод [[yii\base\Model::rules()|rules()]] полностью указывает все существующие сценарии, и если нет надобности в объявлении атрибутов небезопасными.

Более детальная информация представлена в разделе Модели.

Контроллеры

В качестве базового класса для контроллеров в Yii 2.0 используется [[yii\web\Controller]], аналогичный CWebController в Yii 1.1. Базовым классом для всех действий является [[yii\base\Action]].

Одним из основных изменений является то, что действие контроллера теперь должно вернуть результат вместо того, чтобы напрямую выводить его:

public function actionView($id)
{
    $model = \app\models\Post::findOne($id);
    if ($model) {
        return $this->render('view', ['model' => $model]);
    } else {
        throw new \yii\web\NotFoundHttpException;
    }
}

Более детальная информация представлена в разделе Контроллеры.

Виджеты

В Yii 2.0 класс [[yii\base\Widget]] используется в качестве базового класса для виджетов, аналогично CWidget в Yii 1.1.

Для лучшей поддержки фреймворка в IDE, Yii 2.0 использует новый синтаксис для виджетов. Новые статические методы [[yii\base\Widget::begin()|begin()]], [[yii\base\Widget::end()|end()]], и [[yii\base\Widget::widget()|widget()]] используются следующим образом:

use yii\widgets\Menu;
use yii\widgets\ActiveForm;

// Обратите внимание что вы должны выводить результат
echo Menu::widget(['items' => $items]);

// Указываем массив для конфигурации свойств объекта
$form = ActiveForm::begin([
    'options' => ['class' => 'form-horizontal'],
    'fieldConfig' => ['inputOptions' => ['class' => 'input-xlarge']],
]);
... поля формы ...
ActiveForm::end();

Более детальная информация представлена в разделе Виджеты.

Темы

В Yii 2.0 темы работают совершенно по-другому. Теперь они основанны на механизме сопоставления путей исходного файла представления с темизированным файлом. Например, если используется сопоставление путей ['/web/views' => '/web/themes/basic'], то темизированная версия файла представления /web/views/site/index.php будет находится в /web/themes/basic/site/index.php. По этой причине, темы могут быть применены к любому файлу представления, даже к представлению, отрендеренному внутри контекста контроллера или виджета. Тажке, больше не существует компонента CThemeManager. Вместо этого, theme является конфигурируемым свойством компонента приложения view.

Более детальная информация представлена в разделе Темизация.

Консольные приложения

Консольные приложения теперь организованы как контроллеры, аналогично веб приложениям. Консольные контроллеры должны быть унаследованы от класса [[yii\console\Controller]], аналогичного CConsoleCommand в версии 1.1.

Для выполнения консольной команды, используйте yii <маршрут>, где <маршрут> это маршрут контроллера (например, sitemap/index). Дополнительные анонимные аргументы будут переданы в качестве параметров соответствующему действию контроллера, в то время как именованные аргументы будут переданы в соответствие с объявлениями в [[yii\console\Controller::options()]].

Yii 2.0 поддерживает автоматическую генерацию справочной информации из блоков комментариев.

Более детальная информация представлена в разделе Консольные команды.

I18N

В Yii 2.0 были убраны встроенные форматтеры времени и чисел, в пользу PECL intl PHP расширения.

Перевод сообщений теперь осуществляется через компонент приложения i18n. Данный компонент управляет множеством исходных хранилищ сообщений, что позволяет вам использовать разные хранилища для исходных сообщений в зависимости от категории сообщения.

Более детальная информация представлена в разделе Интернационализация.

Фильтры действий

Фильтры действий теперь сделаны с помошью поведений. Для определения нового фильтра, унаследуйтесь от [[yii\base\ActionFilter]]. Для использования фильтра, прикрепите его к контроллеру в качестве поведения. Например, для использования фильтра [[yii\filters\AccessControl]], следует сделать следующее:

public function behaviors()
{
    return [
        'access' => [
            'class' => 'yii\filters\AccessControl',
            'rules' => [
                ['allow' => true, 'actions' => ['admin'], 'roles' => ['@']],
            ],
        ],
    ];
}

Более детальная информация представлена в разделе Фильтры.

Ресурсы

В Yii 2.0 представлена новая возможность связка ресурсов, которая заменяет концепт пакетов скриптов в Yii 1.1.

Связка ресурсов - это коллекция файлов ресурсов (например, Javascript файлы, CSS файлы, файлы изображений, и т. п.) в определенной папке. Каждая связка ресурсов представлена классом, унаследованным от [[yii\web\AssetBundle]]. Связка ресурсов становится доступной через веб, с помощью регистрации ее методом [[yii\web\AssetBundle::register()]]. В отличие от Yii 1.1, страница, регистрирующая связку ресурсов, автоматически будет содержать ссылки на Javascript и CSS файлы, указанные в связке.

Более детальная информация представлена в разделе Ресурсы.

Хелперы

В Yii 2.0 включено много широко используемых статичных классов.

  • [[yii\helpers\Html]]
  • [[yii\helpers\ArrayHelper]]
  • [[yii\helpers\StringHelper]]
  • [[yii\helpers\FileHelper]]
  • [[yii\helpers\Json]]

Более детальная информация представлена в разделе Хелперы.

Формы

Yii 2.0 вводит новое понятие поле для построения форм с помощью [[yii\widgets\ActiveForm]]. Поле - это контейнер, содержащий лейбл, поле ввода, сообщение об ошибке и/или вспомогательный текст. Поле представлено объектом [[yii\widgets\ActiveField|ActiveField]]. Используя поля, вы можете строить формы гораздо проще чем это было раньше:

<?php $form = yii\widgets\ActiveForm::begin(); ?>
    <?= $form->field($model, 'username') ?>
    <?= $form->field($model, 'password')->passwordInput() ?>
    <div class="form-group">
        <?= Html::submitButton('Login') ?>
    </div>
<?php yii\widgets\ActiveForm::end(); ?>

Более детальная информация представлена в разделе Работа с формами.

Построитель запросов

В версии 1.1, построение запроса было разбросано среди нескольких классов, включая CDbCommand, CDbCriteria, и CDbCommandBuilder. В Yii 2.0 запрос к БД представлен в рамках объекта [[yii\db\Query|Query]], который может быть превращен в SQL выражение с помощью [[yii\db\QueryBuilder|QueryBuilder]]. Например,

$query = new \yii\db\Query();
$query->select('id, name')
      ->from('user')
      ->limit(10);

$command = $query->createCommand();
$sql = $command->sql;
$rows = $command->queryAll();

Лучшим спосом использования данных методов является работа с Active Record.

Более детальная информация представлена в разделе Построитель запросов.

Active Record

В Yii 2.0 внесено множество изменений в работу Active Record. Два основных из них, включают в себя построение запросов и работу со связями.

Класс CDbCriteria в версии 1.1 был заменен [[yii\db\ActiveQuery]] в Yii 2.0. Этот класс наследуется от [[yii\db\Query]] и таким образом получает все методы необходимые для построения запроса. Для построения запроса вам следует вызвать метод [[yii\db\ActiveRecord::find()]]:

// Получаем всех *активных* клиентов и сортируем их по ID
$customers = Customer::find()
    ->where(['status' => $active])
    ->orderBy('id')
    ->all();

Для объявления связи следует просто объявить геттер, который возвращает объект [[yii\db\ActiveQuery|ActiveQuery]]. Имя свойства, определенное геттером представляет собой название связи. Например, следующий код объявляет связь orders (в версии 1.1, вам нужно было бы объявить связи в одном центральном месте - relations()):

class Customer extends \yii\db\ActiveRecord
{
    public function getOrders()
    {
        return $this->hasMany('Order', ['customer_id' => 'id']);
    }
}

Теперь вы можете использовать выражение $customer->orders для получения всех заказов клиента из связанной таблицы. Вы также можете использовать следующий код, чтобы применить нужные условия "на лету":

$orders = $customer->getOrders()->andWhere('status=1')->all();

Yii 2.0 осуществляет жадную загрузку (eager loading) связи по другому, в отличие от версии 1.1. В частности, в версии 1.1 для выбора данных из основной и связанной таблиц будет использован запрос JOIN. В Yii 2.0 будут выполнены два запроса без использования JOIN: первый запрос возвращает данные для основной таблицы, а второй - для связанной, с помощью фильтрации по первичным ключами основной таблицы.

Вместо того, чтобы возвращать объекты [[yii\db\ActiveRecord|ActiveRecord]], вы можете использовать метод [[yii\db\ActiveQuery::asArray()|asArray()]] при построении запроса, для выборки большого количества записей. Это заставит вернуть результат запроса в качестве массива, что может существеннос снизить время, нужное ЦПУ и память, при большом количестве записей. Например:

$customers = Customer::find()->asArray()->all();

Еще одно изменение связано с тем, что вы больше не можете определять значения по-умолчанию в качестве свойств. Вы должны устанавить их в методе init вашего класса, если это требуется.

public function init()
{
    parent::init();
    $this->status = self::STATUS_NEW;
}

Тажке в версии 1.1 были некоторые проблемы с переопределением конструктора ActiveRecord. Данные проблемы не присутствуют в версии 2.0. Обратите внимание, что при добавлении параметров в конструктор, вам возможно понадобится переопределить метод [[yii\db\ActiveRecord::instantiate()]]. Переопределение может не потребоваться, если параметры, передаваемые в конструктор будут иметь значения по-умолчанию, например null.

Существует также множество других улучшений в ActiveRecord. Более детальная информация о конфигурация представлена в разделе Active Record.

Компонент приложения user

Класс CWebUser в версии 1.1 теперь заменен классом [[yii\web\User]], а также больше не существует класса CUserIdentity. Вместо этого, вы должны предоставить реализацию интерфейса [[yii\web\IdentityInterface]], что гораздо проще в использовании.

Более детальная информация представлена в разделах Аутентификация, Авторизация и Шаблон приложения advanced.

Разбор и генерация URL

Работа с URL в Yii 2.0 аналогична той, что была в версии 1.1. Основное изменение заключается в том, что теперь поддерживаются дополнительные параметры. Например, если у вас имеется правило, объявленное следующим образом, то оно совпадет с post/popular и post/1/popular. В версии 1.1, вам пришлось бы использовать два правила, для получения того же результата.

[
    'pattern' => 'post/<page:\d+>/<tag>',
    'route' => 'post/index',
    'defaults' => ['page' => 1],
]

Более детальная информация представлена в разделе Разбор и генерация URL.

Использование Yii 1.1 вместе с 2.x

Информация об использовании кода для Yii 1.1 вместе с Yii 2.0 представлена в разделе Одновременное использование Yii 1.1 и 2.0.