Статьи

Чего ожидать от Yii 2.0

Yii 2.0 был выпущен в бета-версии в апреле прошлого года, а цель первого стабильного выпуска была поставлена ​​на середину 2014 года. В списке выпусков GitHub есть 300 открытых выпусков и 2913 закрытых, пока я пишу это, и оба числа продолжают расти. Прогресс до вехи 2.0RC составил 99%. Я думаю, что команда близка, но нам, вероятно, придется подождать немного дольше. Пока мы все ждем, давайте посмотрим на то, что мы можем ожидать, взглянув на уже доступный пример.

Немного истории

Первая версия Yii стала популярной довольно быстро после того, как она была выпущена в 2008 году. Ее основатель, Qiang Xue , ранее работал над фреймворком Prado и использовал опыт и отзывы для создания Yii.

Yii использует много идей из других фреймворков, языков и библиотек: Prado, Ruby, jQuery, Symfony и Joomla признаны источниками вдохновения.

Первые коммиты для Yii 2.0 датируются 2011 годом, но разработка началась в прошлом году. Команда провела переписывание с целью стать современным PHP-фреймворком нового поколения. Он принимает новейшие технологии и функции, такие как Composer, PSR, пространства имен, черты и многое другое.

Стоит упомянуть, что, согласно странице загрузки, поддержка Yii версии 1.1 закончится 31 декабря 2015 года, поэтому у нас есть время подумать о переходе.

Требования

Использование пространств имен и признаков повысило требования к PHP 5.4. Кроме того, вам понадобятся расширения mb_string, PDO и intl, когда вы начнете разработку. Это не должно быть проблемой, если вы запускаете свой собственный сервер, но может быть, если вы находитесь в общей среде. Конечно, со временем этот вопрос исчезнет.

Установка

Yii теперь можно установить из Composer. Мы скоро пройдем этот метод установки.

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

Начиная

Начну с основного примера. Если вы смотрели на Yii раньше, вы узнаете то же самое базовое веб-приложение, с которым поставляется Yii 1.1. Установите базовый пример с Composer, используя следующую команду:

composer.phar create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic

Затем вы можете проверить, соответствует ли ваш сервер требованиям, открыв http: //localhost/yii2-app-basic/requirements.php . Реальное приложение будет запущено с http: // localhost / yii2-app-basic / web / .

Это первое, на что следует обратить внимание: идея заключается в том, что вы устанавливаете корень документа для вашего приложения в /path/to/application/web Макет каталога немного изменился по сравнению с версией 1.1. Если вы внимательно посмотрите, изменение имеет смысл и улучшит безопасность вашего приложения.

Ранее все компоненты приложения (модели, представления, контроллеры, библиотеки инфраструктуры и библиотеки поставщиков) находились в корневом каталоге документа в protected Таким образом, безопасность зависела от файлов .htaccess Перемещение всех компонентов приложения из корня документа не позволяет веб-серверу отправлять компоненты приложения пользователю.

Вы можете найти фактические источники фреймворка. Каркас является компонентом, который был установлен с помощью Composer, поэтому он будет находиться в vendor\yiisoft\yii Здесь вы найдете гораздо больше, но сейчас мы просто оставим это на этом.

А сейчас давайте изменим конфигурацию локального веб-сервера и установим корневой каталог документа в /path/to/application/web Я добавил виртуальный хост http: //yii2-app-basic.localhost/ , но делайте так, как считаете нужным для вашей собственной ситуации. Конфигурация по умолчанию настроена на скрытие файла скрипта в URL. Если вы используете Apache, вам нужно добавить файл .htaccess

 RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Посмотрите на базовое приложение Yii

Теперь, когда у нас запущено основное приложение, некоторые поздравления в порядке …

Yii2_installed.png

Благодарность! Пока нет ракетостроения.

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

Дизайн основного приложения сильно изменился. Раньше вы получали приложение, построенное на CSS-структуре Blueprint, а теперь мы начинаем с Twitter Bootstrap. Улучшение? Вероятно, его сравнивают с Blueprint, но опять же Bootstrap намного больше, чем когда-либо пытался быть Blueprint.
Bootstrap предоставит вам все виды компонентов приложения и ускорит создание приложения. Некоторые могут возразить, с другой стороны, что все сайты выглядят одинаково с Bootstrap (темы исправляют это только частично), и это также увеличит размер вашего сайта. В любом случае, интеграция с Yii 2.0 осуществляется с расширением yii2-bootstrap. Это позволяет легко интегрировать компоненты Bootstrap в ваши представления.

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

Yii2 debugger

Yii обрабатывает ошибки, отличающиеся от тех, что обычно делает PHP. Yii преобразует все ошибки (фатальные и нефатальные) в исключения. Они обрабатываются путем предоставления проницательного вывода, указывающего вам на точку, где вы запутались или ваш код сгенерировал уведомление. Даже ошибки синтаксического анализа, для которых Yii 1.1 вернется к базовым ошибкам PHP, получат прекрасный обзор вашего кода. Это то, что большинство из нас оценит.

Yii2 error handling

Gii также присутствует снова и активирован по умолчанию.

Yii2 Gii

Gii поможет вам сгенерировать код для начала, еще один отличный инструмент, который поможет ускорить вашу разработку. Он будет генерировать модели и контроллеры для вас. Генератор CRUD сделает еще один шаг и сгенерирует полный набор MVC для всех действий. Gii также сгенерирует код, лучше подходящий для интернационализации (i18n), немедленно вставив функцию Yii::t()

Базовое приложение теперь также поставляется с простым приложением командной строки, которое вы можете создать. Yii 1.1 уже поддерживал это, но вы должны получить пример из Wiki.

Это то, что вы найдете в основном приложении. Также доступен расширенный пример приложения. Он имеет несколько иную структуру, но добавляет еще больше функциональности к вашему приложению из коробки:

  • Авторизация пользователя, аутентификация и восстановление пароля.
  • Приложение разделено на фронт и бэкэнд.

Продолжая смотреть на базовую версию, давайте внимательнее посмотрим и углубимся в код…

Что изменилось?

Многое изменилось. Некоторые изменения могут сначала сбить вас с толку, но я считаю, что большинство изменений имеют смысл и их легко принять. Вот некоторые из изменений, которые мне показались интересными, веселыми или удивительными.

Требование PHP 5.4 сделало возможными некоторые изменения; короткие массивы доступны. Также безопасно использовать короткие ярлыки echo в представлениях, потому что это больше не зависит от настроек конфигурации.

 <?php
$elements = array(1,2,3,4); //Yii 1.1
$elements = [1,2,3,4]; //Yii 2.0
?>
<?php echo $someVar; ?> //Yii 1.1
<?= $someVar ?> //always safe to use in Yii 2.0

Небольшое изменение, но вы быстро столкнетесь; раньше вы использовали Yii::app() В Yii 2.0 это изменилось со статической функции на статическую переменную Yii::$app

Функция перевода Yii::t() Он инструктирует Yii использовать компонент i18n для перевода предоставленного текста на текущий используемый язык. Вы также можете поручить ему заменить переменные.

 <?php
echo `Yii::t('app', 'Hello, {username}!', [
  'username' => $username,
]);
?>

Форматирование и стиль заполнителя были серьезно переработаны, что позволило расширить возможности форматирования. Несколько примеров:

 <?php
echo \Yii::t('app', '{n, number} is spelled as {n, spellout}', ['n' => 81]);
echo \Yii::t('app', 'You are {n, ordinal} in line, please hold.', ['n' => 3]); //Will echo "You are 3rd in line, please wait.".
echo \Yii::t('app', 'There {n, plural, =0{are no cats} =1{is one cat} other{are # cats}}!', array(
    'n' => 14,
));
?>

Из-за этого заполнителя форматирование DateTimeFormatter отсутствует:

 <?php
//Previously in Yii 1.1
Yii::app()->dateFormatter->formatDateTime(time(), 'medium', 'medium');

//In Yii 2.0
echo \Yii::t('app', 'The date is {0, date, short}', time());    //uses the pre-defined 'short' notation (i18n save)
echo \Yii::t('app', 'The date is {0, date, YYYY-MM-dd}', time()); //or define your own notation
?>

Эта функциональность предоставляется библиотекой ICU. Документация Yii называет оригинальную документацию для этого «довольно загадочной». Смею вас прочитать и попытаться понять … Будем надеяться, что документация по Yii со временем станет более читаемой.

Контроллеры

Раньше accessControl() В Yii 2.0 управление доступом является частью behavior()<?php
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout','login','signup'],
'rules' => [
[
'allow' => true,
'actions' => ['logout'],
'roles' => ['@'],
],
[
'allow' => true,
'actions' => ['login', 'signup'],
'roles' => ['?'],
],
],
],
];
}
?>

 <?php
$authors = Authors::find()
    ->where(['sitepointChannel' => $channel])
    ->orderBy('lastName')
    ->all();
?>

Это почти идентично тому, как это было в Yii 1.1.

Я заметил, что в примере кода (а не в самой платформе!) Пропущено много блоков документации и много комментариев @inheritdoc. Это не то, что вы ожидаете от примера, но я предполагаю, что это будет исправлено вовремя.

модели

Базовая модель (ранее CModel) не сильно изменилась. Сценарии теперь позволяют изменять применение правил проверки. Вы можете изменить то, что должно быть проверено на основе вашего текущего сценария (то есть модель с другими правилами при использовании из внешнего или внутреннего интерфейса).

Однако производная ActiveRecord претерпела некоторые серьезные изменения. Синтаксис для поиска с ActiveRecord больше походил на написание запросов, потому что CDbCriteria больше не существует. Он был заменен ActiveQuery, что облегчает получение информации:

 <?php
//Define the relations
public function relations()
{
  return array(
    'posts' => array(self::HAS_MANY, 'Posts', 'authorID'),
    'comments' => array(self::HAS_MANY, 'Comments', array('ID'=>'PostID'), 'through'=>'posts'),
  );
}

//Querying an author with posts and comments
$activity = Author::model()->with(array('posts','comments')->find('fullname = "Arno Slatius"');
$posts = $activity->posts;
$comments = $activity->comments;
?>

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

 via()

Как видите, вы должны определить все отношения активной записи в большом массиве. В Yii 2.0 вам нужно будет определить методы получения, которые возвращают объект ActiveQuery для всех этих отношений. Вы должны будете использовать ключевое слово «through» в отношении, чтобы определить связь между промежуточной таблицей.

Теперь у вас есть два варианта для определения этого; обычно вы используете метод viaTable() Вы также можете определить отношение с помощью <?php
//Define relations by creating getter functions
public function getPosts()
{
return $this->hasMany(Posts::className(), ['authorID' => 'ID']);
}
public function getComments()
{
return $this->hasMany(Comments::className(), ['ID' => 'PostID'])
->via('Posts');
}
//If you'd only need comments you'd define it at once:
public function getComments()
{
return $this->hasMany(Comments::className(), ['ID' => 'PostID'])
->viaTable(Posts::className(), ['authorID' => 'ID']);
}

//Querying an author with posts and comments
$activity= Authors::findOne(['fullname' => 'Arno Slatius']);
$posts = $activity->posts;
$comments = $activity->comments;
?>
Тот же пример, что и выше, но теперь для Yii 2.0:

 where()

Это довольно простой пример. Определение отношений через функции получения, которые возвращают объекты ActiveQuery, позволяет сделать гораздо больше. Например, вы можете добавить определенную функцию, которая выполняет запрос для сообщений, которые получают> 50 комментариев, добавив вызов $this

Интересным дополнением является возможность определения перекрестных отношений СУБД. Вы можете определить отношения между, например, MySQL и MongoDB или Redis и использовать их в своем приложении как один объект.

Взгляды

Главное, что следует отметить в представлениях, это то, что $this В представлении yii\web\View$this->context Контроллер доступен через <h1><?= Html::encode($this->title) ?></h1>

Как я сказал ранее; PHP 5.4 делает доступным короткий эхо-тег. Это делает представления, которые состоят из смешанного PHP и HTML, более читабельными;

 render()

Функции renderPartial()echo Перед тем, как он автоматически отобразит вывод, и вам нужно будет добавить дополнительный параметр, чтобы получить вывод в виде строки. Yii 2.0 всегда будет возвращать строку при вызовах, похожих на render()

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

Стоит ли вам вовремя обновить приложение Yii 1.1 до Yii 2.0?

Бруно Шкворц недавно написал о прежнем коде здесь, на SitePoint. Он утверждает, что следует рассмотреть возможность переписывания, которое можно выполнить за 2 месяца, особенно если используемое программное обеспечение критично для бизнеса. Я согласен с ним и предлагаю вам рассмотреть его, если вы серьезно относитесь к своему заявлению и хотите сохранить его после окончания срока действия Yii 1.1. Впрочем как всегда; это зависит от вашей ситуации.

На сайте Yii есть специальная страница, посвященная обновлению Yii . Самая большая проблема на данный момент — ваши расширения. Если вы полагаетесь на большое количество расширений, вам будет трудно, потому что сообществу потребуется некоторое время, чтобы заняться (пере) написанием расширений для Yii 2.0. Если вы настоящий профессионал, вы, конечно, можете серьезно взглянуть на используемые вами расширения и подумать (пере) их написать.

В руководстве по миграции есть раздел по совместному запуску Yii 1.1 и Yii 2.0 в приложении. Для больших проектов это хороший способ создать безопасный путь миграции. Перенесите свой общий код в Yii 2.0 и найдите время для более сложных или расширенных частей.

Вывод

Переход к «Полному руководству по Yii 2.0» вызывает у меня все больший энтузиазм по поводу начала работы с Yii 2.0. Мне уже пришлось помешать себе использовать его в новом проекте, потому что я не мог рисковать проблемами с подготовительным кодом.

Качество документации для Yii 2.0 улучшено по сравнению с Yii 1.1. Мне было трудно разобраться, когда я начал работать с Yii 1.1 несколько лет назад, и я чувствую, что документация более обширна, чем раньше.

Вы уже смотрели на Yii 2.0 или, может быть, уже что-то сделали с ним? Пожалуйста, расскажите нам, что вы столкнулись. Я хотел бы знать ваш опыт!