Yii 2   What’s new?




               Alexander Makarov,
                     Yii core team
Some statistics
Who uses Yii?
*intranet
2   2
Why?
1.Well-balanced
2.Stable
3.Flexible
4.Well-documented
2011 — beginning of 2012 events
What happened?
• 5 stable Yii 1.1 releases   • Events:
• Yii 1.1 Application           – Yii beer party
  Development Cookbook          – YiiTalk
• Yii for Eclipse PDT,          – YiiConf
  CodeLobster
• Yii → GitHub
First two days
—348 watches
—61 forks
Now
—1134 watches
—240 forks
Yii 1.1.11 will be quite interesting
             release ;)
What’s bad in Yii 1.1?
• AR (finder and record are the same object,
  some API).
• Some classes are in strange places.
• More small things.



     The biggest issue is
                               BC
*
              *                 *



       *                                          
2004       2005   2006   2007       2008   2011




Prado, from 2004 → Yii 1.0, 2008 → Yii 1.1, 2010
Yii 2 team


—3 active core developers: qiang, samdark,
 mdomba.
—github.
—PHP 5.3.8+              —Better structure
—All classes are         —Less entities
 namespaced (yii) and   —Keep good ideas
 w/o prefix
—PSR-0




                                    v2
Documentation
—Larry Ullman, author of 22 excellent IT-books
 and a great article series about Yii will write a
 book about Yii2 + will participate in official
 documentation writing.
—API docs will be at least same quality as 1.1.
—Code style guide.
—There’s a plan to release documentation tool
 to the public.
Yii2: base
— Aliases in form of     class MyComponent extends
  @yii/base/Component    yiibaseObject
                         {
— CComponent →             public $x;
  Object + Component       public function __construct($a, $b)
— SPL replaced most of     {
  collections                  //…
                           }
— Removed
                         }
  CFormModel. Now
  you can use Model      $component = MyComponent::newInstance(
  directly.                array('x'=>10),
                           'a', 'b'
                         );
Yii2: View Object
         —render(), widget(),
          beginCache() →
          viewObject
         —In a View: $owner =
          class that uses view
         —$this = View.
         —No need for renderer.
         —Can be used in console
          applications.
         —CHtml is still there.
Yii2: events
$post->on('add',          • No need to
function($event) { ...      explicitly declare
});                         before raising
                          • jQuery-like syntax
$post->trigger('add',     • Behaviors instead of
new Event($this));          filters

$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()               – Can create your own
       ->one();                   finder
$customer->name = 'Qiang';
                                – ::model()
$customer->save();
                                – Auto quoting.
$customers = Customer::find()   – Method chains.
       ->order('id')
       ->asArray(true)
       ->all();
Yii2: AR
$postFinder = Post::find()       – Criteria
  ->where(array(                 – Can merge two finders
    'active' => true
                                 – Can add conditions on
));
                                   the fly
if($isPrivate) {
  $postFinder->addWhere(array(
    'createdBy' => $userId,
  ));
}
$posts = $postFinder
  ->mergeWith($anotherFinder)
  ->all();
Yii2: AR
                            class Customer extends ActiveRecord {
– tableName(),                      const STATUS_ACTIVE = 1;
  relations(), scopes() =
                                    public static function tableName() {
  static.                                   return 'tbl_customer';

– Relations are                     }

  HAS_ONE,                          public static function relations() {

  HAS_MANY.                                 return array(
                                                    'orders:Order[]' => array(
– link = FKs                => 'id'),
                                                            'link' => array('customer_id'


– via = through                             );
                                                    ),


– Anonymous functions               }

  for scopes.                       public static function scopes() {

– "@." and "?" tokens:                      return array(
                                                    'active' => function($q) {
  own table, external                                       return $q-
                            >andWhere('@.`status` = ' . self::STATUS_ACTIVE);
  table.                                            },
                                            );
                                    }
                            }
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 (if there will be enough time)
•   HTTP (CURL) wrapper    • jQueryUI-based widgets
•   Package manager        • Commercial support
•   Mailer
•   Twitter Bootstrap
•   Debug toolbar
•   Console requirements
•   More helpers
1 or 2?



Don’t wait. Work with stable one.
When?
Before alpha code will be   •   Base for caching
put into public github      •   Base for i18n
repository we need to       •   Controller + webapp
finish at least these
things→                     •   Base for widgets
                            •   URL manager
Want more info?
—http://www.yiiframework.co
 m/forum/index.php/forum/4
 2-design-discussions-for-yii-
 20/
Questions?


yiiframework.com
 yiiframework.ru
   rmcreative.ru

YiiConf 2012 - Alexander Makarov - Yii2, what's new

  • 1.
    Yii 2 What’s new? Alexander Makarov, Yii core team
  • 3.
  • 6.
  • 7.
  • 9.
    2 2
  • 10.
  • 11.
  • 12.
    2011 — beginningof 2012 events
  • 13.
    What happened? • 5stable Yii 1.1 releases • Events: • Yii 1.1 Application – Yii beer party Development Cookbook – YiiTalk • Yii for Eclipse PDT, – YiiConf CodeLobster • Yii → GitHub
  • 15.
    First two days —348watches —61 forks
  • 16.
  • 17.
    Yii 1.1.11 willbe quite interesting release ;)
  • 18.
    What’s bad inYii 1.1? • AR (finder and record are the same object, some API). • Some classes are in strange places. • More small things. The biggest issue is BC
  • 19.
    * * * *  2004 2005 2006 2007 2008 2011 Prado, from 2004 → Yii 1.0, 2008 → Yii 1.1, 2010
  • 20.
    Yii 2 team —3active core developers: qiang, samdark, mdomba. —github.
  • 21.
    —PHP 5.3.8+ —Better structure —All classes are —Less entities namespaced (yii) and —Keep good ideas w/o prefix —PSR-0 v2
  • 22.
    Documentation —Larry Ullman, authorof 22 excellent IT-books and a great article series about Yii will write a book about Yii2 + will participate in official documentation writing. —API docs will be at least same quality as 1.1. —Code style guide. —There’s a plan to release documentation tool to the public.
  • 23.
    Yii2: base — Aliasesin form of class MyComponent extends @yii/base/Component yiibaseObject { — CComponent → public $x; Object + Component public function __construct($a, $b) — SPL replaced most of { collections //… } — Removed } CFormModel. Now you can use Model $component = MyComponent::newInstance( directly. array('x'=>10), 'a', 'b' );
  • 24.
    Yii2: View Object —render(), widget(), beginCache() → viewObject —In a View: $owner = class that uses view —$this = View. —No need for renderer. —Can be used in console applications. —CHtml is still there.
  • 25.
    Yii2: events $post->on('add', • No need to function($event) { ... explicitly declare }); before raising • jQuery-like syntax $post->trigger('add', • Behaviors instead of new Event($this)); filters $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() – Can create your own ->one(); finder $customer->name = 'Qiang'; – ::model() $customer->save(); – Auto quoting. $customers = Customer::find() – Method chains. ->order('id') ->asArray(true) ->all();
  • 28.
    Yii2: AR $postFinder =Post::find() – Criteria ->where(array( – Can merge two finders 'active' => true – Can add conditions on )); the fly if($isPrivate) { $postFinder->addWhere(array( 'createdBy' => $userId, )); } $posts = $postFinder ->mergeWith($anotherFinder) ->all();
  • 29.
    Yii2: AR class Customer extends ActiveRecord { – tableName(), const STATUS_ACTIVE = 1; relations(), scopes() = public static function tableName() { static. return 'tbl_customer'; – Relations are } HAS_ONE, public static function relations() { HAS_MANY. return array( 'orders:Order[]' => array( – link = FKs => 'id'), 'link' => array('customer_id' – via = through ); ), – Anonymous functions } for scopes. public static function scopes() { – "@." and "?" tokens: return array( 'active' => function($q) { own table, external return $q- >andWhere('@.`status` = ' . self::STATUS_ACTIVE); table. }, ); } }
  • 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 (if therewill be enough time) • HTTP (CURL) wrapper • jQueryUI-based widgets • Package manager • Commercial support • Mailer • Twitter Bootstrap • Debug toolbar • Console requirements • More helpers
  • 32.
    1 or 2? Don’twait. Work with stable one.
  • 33.
    When? Before alpha codewill be • Base for caching put into public github • Base for i18n repository we need to • Controller + webapp finish at least these things→ • Base for widgets • URL manager
  • 34.
    Want more info? —http://www.yiiframework.co m/forum/index.php/forum/4 2-design-discussions-for-yii- 20/
  • 35.