Yii2   Что нового?




             Александр Макаров,
                    Yii core team
Немного статистики
Кто использует Yii?
*интранет
2   2
Почему?
1.Баланс
2.Стабильность
3.Гибкость
4.Документация
События 2011 — начала 2012
Что же произошло?
• 5 стабильных версий    • Окончательно вылезли
  Yii 1.1                  из «подполья»:
• Yii 1.1 Application      – Yii beer party
  Development Cookbook     – YiiTalk
• Yii for Eclipse PDT,     – YiiConf
  CodeLobster
• Yii → GitHub
За два первые дня
—348 watches
—61 forks
Сейчас
—1134 watches
—240 forks
Yii 1.1.11 будет интересным ;)
Что плохо в Yii 1.1?
• AR (finder и record не разделены, API).
• Некоторые классы в странных местах.
• Куча мелочей.




     Самое страшное —
                               BC
*
              *                 *



       *                                          
2004       2005   2006   2007       2008   2011




  Prado, с 2004 → Yii 1.0, 2008 → Yii 1.1, 2010
Команда Yii 2


—3 активных core-разработчика: qiang,
 samdark, mdomba.
—github.
—PHP 5.3.8+               —Улучшаем структуру
—Все классы в             —Убиваем лишние
 namespace (yii) и без    сущности
 префикса                 —Сохраняем плюсы
—PSR-0




                                    v2
Документация
—Larry Ullman, автор 22-х отличных IT-книг и
 серии статей про Yii: книга + участие в
 официальной документации.
—API не хуже 1.1.
—Code style.
—Есть план сделать тулзу для генерации API
 применимой к пользовательским
 приложениям… или вообще убить
 перегенерацию.
Yii2: base
— Алиасы вида           class MyComponent extends
  @yii/base/Component   yiibaseObject
                        {
— CComponent →            public $x;
  Object + Component      public function __construct($a, $b)
— SPL вместо              {
  большинства                 //…
  коллекций               }
                        }
— Убит CFormModel в
  пользу Model          $component = MyComponent::newInstance(
                          array('x'=>10),
                          'a', 'b'
                        );
Yii2: View Object
         — render(), widget(),
           beginCache() →
           viewObject
         — В View: $owner = тот, кто
           запустил метод
         — $this = View.
         — Не нужны renderer.
         — Можно использовать в
           консоли.
         — CHtml никуда не делся.
Yii2: events
$post->on('add',          • Не нужна декларация
function($event) { ...    • Синтаксис похож на
});                         jQuery
                          • Behavior-ы заменят
$post->trigger('add',       фильтры
new Event($this));

$post->off('add',
$callback);

$handlers = $post-
>getEventHandlers('add'
);
Yii2: Query object

// Query object
$query = new Query;
$query->select('id')->from('tbl_customer')->limit(10);
$command = $db->createCommand($query);
$this->assertEquals("SELECT `id` FROM `tbl_customer`
LIMIT 10", $command->sql);

// array
$command = $db->createCommand(array(
       'select' => 'name',
       'from' => 'tbl_customer',
));
Yii2: AR
$customer = Customer::find(2)   – Finder / Model
       ->active()               – Можно сделать свой
       ->one();                   finder
$customer->name = 'Qiang';
                                – ::model()
$customer->save();
                                – Автокавычки.
$customers = Customer::find()   – Method chains.
       ->order('id')
       ->asArray(true)
       ->all();
Yii2: AR
$postFinder = Post::find()       – Criteria
  ->where(array(                 – Можно мёржить finder
    'active' => true
                                 – Можно дополнять
));
                                   условия на ходу
if($isPrivate) {
  $postFinder->addWhere(array(
    'createdBy' => $userId,
  ));
}
$posts = $postFinder
  ->mergeWith($anotherFinder)
  ->all();
Yii2: AR
– tableName(),
                             class Customer extends ActiveRecord {
                                     const STATUS_ACTIVE = 1;
  relations(), scopes() =
                                     public static function tableName() {
  static.                                    return 'tbl_customer';

– Связи HAS_ONE,                     }

  HAS_MANY.                          public static function relations() {
                                             return array(
– link = FKs                                         'orders:Order[]' => array(

– via = through
                                                             'link' => array('customer_id'
                             => 'id'),

– Анонимки для
                                                     ),
                                             );
  scopes.                            }

– Токены "@." и "?.                  public static function scopes() {
                                             return array(
  Автоалиас. Своя                                    'active' => function($q) {
  таблица. Внешняя                                           return $q-
                             >andWhere('@.`status` = ' . self::STATUS_ACTIVE);
  таблица.                                           },
                                             );
                                     }
                             }
Yii2: AR
$customers =                 $customers =
Customer::find()->           Customer::find()->active()
asArray()->all();            ->all();

foreach (Customer::find()    $customers =
as $customer)                Customer::find()
                             ->where('name like :name',
$count = Customer::count()   array(
->value();                     ':name' => '%customer%‘
                             ))->order('id')->all();
TODO (если успеем)
•   HTTP (CURL) wrapper    • Виджеты на базе
•   Package manager          jQueryUI
•   Mailer                 • Коммерческая
•   Twitter Bootstrap        поддержка
•   Debug toolbar
•   Console requirements
•   More helpers
1 или 2?



Ждите, но работайте на стабильном.
Когда?
До альфы на github       •   Базу для кеша
нужно доделать, как      •   Базу для i18n
минимум, вот эти штуки   •   Controller + webapp
→
                         •   Базу для виджетов
                         •   URL manager
Что почитать?
—http://www.yiiframework.co
 m/forum/index.php/forum/4
 2-design-discussions-for-yii-
 20/
Вопросы?


yiiframework.com
 yiiframework.ru
   rmcreative.ru

Yii 2. Что нового?

  • 1.
    Yii2 Что нового? Александр Макаров, Yii core team
  • 3.
  • 6.
  • 7.
  • 9.
    2 2
  • 10.
  • 11.
  • 12.
    События 2011 —начала 2012
  • 13.
    Что же произошло? •5 стабильных версий • Окончательно вылезли Yii 1.1 из «подполья»: • Yii 1.1 Application – Yii beer party Development Cookbook – YiiTalk • Yii for Eclipse PDT, – YiiConf CodeLobster • Yii → GitHub
  • 15.
    За два первыедня —348 watches —61 forks
  • 16.
  • 17.
    Yii 1.1.11 будетинтересным ;)
  • 18.
    Что плохо вYii 1.1? • AR (finder и record не разделены, API). • Некоторые классы в странных местах. • Куча мелочей. Самое страшное — BC
  • 19.
    * * * *  2004 2005 2006 2007 2008 2011 Prado, с 2004 → Yii 1.0, 2008 → Yii 1.1, 2010
  • 20.
    Команда Yii 2 —3активных core-разработчика: qiang, samdark, mdomba. —github.
  • 21.
    —PHP 5.3.8+ —Улучшаем структуру —Все классы в —Убиваем лишние namespace (yii) и без сущности префикса —Сохраняем плюсы —PSR-0 v2
  • 22.
    Документация —Larry Ullman, автор22-х отличных IT-книг и серии статей про Yii: книга + участие в официальной документации. —API не хуже 1.1. —Code style. —Есть план сделать тулзу для генерации API применимой к пользовательским приложениям… или вообще убить перегенерацию.
  • 23.
    Yii2: base — Алиасывида class MyComponent extends @yii/base/Component yiibaseObject { — CComponent → public $x; Object + Component public function __construct($a, $b) — SPL вместо { большинства //… коллекций } } — Убит CFormModel в пользу Model $component = MyComponent::newInstance( array('x'=>10), 'a', 'b' );
  • 24.
    Yii2: View Object — render(), widget(), beginCache() → viewObject — В View: $owner = тот, кто запустил метод — $this = View. — Не нужны renderer. — Можно использовать в консоли. — CHtml никуда не делся.
  • 25.
    Yii2: events $post->on('add', • Не нужна декларация function($event) { ... • Синтаксис похож на }); jQuery • Behavior-ы заменят $post->trigger('add', фильтры new Event($this)); $post->off('add', $callback); $handlers = $post- >getEventHandlers('add' );
  • 26.
    Yii2: Query object //Query object $query = new Query; $query->select('id')->from('tbl_customer')->limit(10); $command = $db->createCommand($query); $this->assertEquals("SELECT `id` FROM `tbl_customer` LIMIT 10", $command->sql); // array $command = $db->createCommand(array( 'select' => 'name', 'from' => 'tbl_customer', ));
  • 27.
    Yii2: AR $customer =Customer::find(2) – Finder / Model ->active() – Можно сделать свой ->one(); finder $customer->name = 'Qiang'; – ::model() $customer->save(); – Автокавычки. $customers = Customer::find() – Method chains. ->order('id') ->asArray(true) ->all();
  • 28.
    Yii2: AR $postFinder =Post::find() – Criteria ->where(array( – Можно мёржить finder 'active' => true – Можно дополнять )); условия на ходу if($isPrivate) { $postFinder->addWhere(array( 'createdBy' => $userId, )); } $posts = $postFinder ->mergeWith($anotherFinder) ->all();
  • 29.
    Yii2: AR – tableName(), class Customer extends ActiveRecord { const STATUS_ACTIVE = 1; relations(), scopes() = public static function tableName() { static. return 'tbl_customer'; – Связи HAS_ONE, } HAS_MANY. public static function relations() { return array( – link = FKs 'orders:Order[]' => array( – via = through 'link' => array('customer_id' => 'id'), – Анонимки для ), ); scopes. } – Токены "@." и "?. public static function scopes() { return array( Автоалиас. Своя 'active' => function($q) { таблица. Внешняя return $q- >andWhere('@.`status` = ' . self::STATUS_ACTIVE); таблица. }, ); } }
  • 30.
    Yii2: AR $customers = $customers = Customer::find()-> Customer::find()->active() asArray()->all(); ->all(); foreach (Customer::find() $customers = as $customer) Customer::find() ->where('name like :name', $count = Customer::count() array( ->value(); ':name' => '%customer%‘ ))->order('id')->all();
  • 31.
    TODO (если успеем) • HTTP (CURL) wrapper • Виджеты на базе • Package manager jQueryUI • Mailer • Коммерческая • Twitter Bootstrap поддержка • Debug toolbar • Console requirements • More helpers
  • 32.
    1 или 2? Ждите,но работайте на стабильном.
  • 33.
    Когда? До альфы наgithub • Базу для кеша нужно доделать, как • Базу для i18n минимум, вот эти штуки • Controller + webapp → • Базу для виджетов • URL manager
  • 34.
  • 35.