Yii2

Обзор public preview

Александр Макаров

Yii core team, Stay.com

https://github.com/yiisoft/yii2/

roadmap там же в wiki

Насколько отличается от 1.1?

  • Нет обратной совместимости с 1.1
  • Хорошие идеи остались, но архитектура поменялась

Требования

  • PHP 5.3.7+
  • mb_string
  • PDO

Почему не 5.4+?

  • Можно использовать в приложении.
  • Не требуется для работы фреймворка.

namespace

  • Все классы в namespace.
  • Нет префиксов вроде C.
  • PSR-0.
  • Умеренная вложенность.

alias

Используются для настройки компонент и автозагрузки классов.


echo \Yii::getAlias('@yii'); // директория фреймворка
echo \Yii::getAlias('@app'); // директория приложения
\Yii::setAlias('@Zend', '@app/vendors/Zend'); // определяем псевдоним для корня ZF и позволяем подгружать его классы

Начинаются с @.

Базовые классы

  • \yii\base\Object — геттеры и сеттеры, метод init, конфигурирование массивом, Object::className().
  • \yii\base\Component extends Object — event, behavior.

class GoogleMap extends \yii\base\Object
{
  public function __construct($param1, $param2, $config = array())
  {
    // ...
    parent::__construct($config);
  }

  public function init()
  {
    // ...
    parent::init();
  }
}

Создаём объект


$object = \Yii::createObject(array(
  'class' => '\app\components\GoogleMap',
  'apiKey' => 'xyz',
  'apiSecret' => 'cde',
), $param1, $param2);

События

API простой, нет необходимости декларировать заранее:


$component->on($eventName, $handler);
$component->off($eventName, $handler);
$component->trigger($eventName, Event $eventObject = null);

Глобальные события:


// инициируем
\Yii::$app->trigger($eventName);

// подписываемся
\Yii::$app->on($eventName, $handler);

Зачистка

  • Классы расположены лучше.
  • Лучше названия.
  • Убили коллекции (SPL достаточно).

View

  • Объект View — данные, скрипты, render.
  • $this в шаблонах ссылается на него.
  • $this->context на контроллер или другого родителя.
  • Можно использовать в консоли.
  • Темы (работают иначе).
  • Renderer-ы (Smarty, Twig).

Виджеты


echo \yii\widgets\Menu::widget(array(
  'items' => $items,
));

ActiveForm


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

Asset bundle

  • Скрипты описываются пакетами.
  • Решает проблему зависимостей.
  • Можно сжимать, сливать и преобразовывать консольной командой.

Controller

  • echo $this->render(...);
  • Консоль и web аналогичны.
  • Слои для request и response.
  • Фильтры теперь ялвяются behavior-ами.

Model

Убили CFormModel.

  • Описание валидаторов отделено от сценариев.
  • Массовое присваивание не работает без валидации и сценариев.

AR, DAO, Query Builder, критерии

Один синтаксис для всего.


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

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

$users = User::model()->find()
  ->orderBy('id DESC')
  ->limit(10)
  ->all();

В AR разделены модель и finder


$finder = Post::find()->where(array('a' => 10));
$finder2 = clone $finder;
$finder2->addWhere(array('b' => 1));

$model = $finder->one();
$model2 = $finder2->one();

// шорткаты
$post = Post::find(10); // pk = 10
$post = Post::find(array('a' => 10, 'b' => 1)); // where a = 10 and b = 1

Связи AR

  • Только два типа has one, has many.
  • Объявляются методами.

class User extends \yii\db\ActiveRecord
{
  public function getPosts()
  {
    return $this->hasMany('Post', array('user_id' => 'id'));
  }

  public function getActivePosts()
  {
    return $this->hasMany('Post', array('user_id' => 'id'))
      ->where(array('status' => Post::STATUS_ACTIVE));
  }
}

$posts = $user->getPosts()->limit(10)->all();

AR не использует JOIN для связей

  • Примерно то же по производительности.
  • Легче кешировать.
  • Можно работать с noSQL.

AR asArray


$posts = Post::find()->limit(10)->asArray()->all();
foreach($posts as $post) {
  echo $post['title']."\n";
}

dirty attributes и link

При save() сохраняется только то, что поменялось.

Появился метод link для сохранения связанных записей и unlink для удаления.


$comment = new Comment();
$comment->text = 'Hello, Yii!';

$post->link('comments', $comment);

Консоль

  • API как для web.
  • yii sitemap/index all --verbose
  • help из phpdoc
  • Цвета (к встроенным командам пока не применялись)

Хелперы

  • Так и остались статичными классами.
  • Расширяемы (LSB, namespace).
  • ArrayHelper, StringHelper, SecurityHelper, FileHelper...

$mergedConfig = ArrayHelper::merge($baseConfig, $specificConfig);

$posts = Post::model()->limit(10)->all();
$titles = ArrayHelper::getColumn('title');

$hash = SecurityHelper::generatePasswordHash($password);
// ...пишем хеш в базу...

// при логине читаем хеш из базы
if (SecurityHelper::verifyPassword($password, $hash) {
  // всё нормально
} else {
  // плохой пароль
}

Ошибки

  • Все ошибки конвертируются в исключения.
  • Ловит fatal-ы и логирует их.
  • Новый шаблон.

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

  • API документируется сразу
  • Code style (почти PSR-1 и PSR-2)
  • Larry Ullman выпустит книгу
  • Гайд пишется

Производительность

  • Быстрее грузятся классы за счёт PSR-0.
  • Меньше классов.
  • Кушает меньше памяти.
  • Новый AR быстрее и также менее требователен к памяти.
  • asArray

Composer

Либо полностью, либо никак...

  • Главный репозиторий со всем кодом.
  • Отдельные «чистые» read-only subtree-репозитории для пакетов.
  • ZIP для тех, у кого проблемы с консолью.

Рекомендуемый способ работы с Yii2:


curl -s http://getcomposer.org/installer | php
php composer.phar create-project --stability=dev yiisoft/yii2-bootstrap path/to/install

Планы и доделки

  • request/response
  • noSQL for AR
  • debug toolbar
  • gii
  • gridview
  • API doc generator

Почему велосипеды

Почему не monolog, компоненты Symfony и т.д.?

Мы можем это сделать качественно и с более приятным API в стиле фреймворка.

Темп

  • Сообщество гиперактивно.
  • 192 форка, 805 фолловеров (1060/2702 у 1.1).
  • Отметился pull request-ом Расмус Лердорф :)

Не используйте в production!

1.1 стабилен и поддерживается минимум до 2016

Попробовать стоит

The end