Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
v2


Александр Макаров
       Yii core team
            Stay.com
Yii?
 PHP5 MVC.              Мощный кеш.
 Приятный API.
                         RBAC, авторизация.
 DAO, AR, миграции.
 Построитель форм.      Консоль.
 Темы.                  Обработка ошибок,
 Тесты.                  лог.
 Документирован.        Gii.
 Сообщество.
 BSD.                   CLDR, I18n.
                         Виджеты.
*intranet
Что важно в фреймворке
– Легко изучать.
– Легко отлаживать и исправлять ошибки.
– Не должен мешать вашему коду или любому
  нормальному стороннему коду.
– Отличное сообщество.
– Обратно совместимый и стабильный.
– Не мешает расширять и настраивать.
– Приятен ;)
*
              *                 *



       *                                          
2004       2005   2006   2007       2008   2011




  Prado, с 2004 → Yii 1.0, 2008 → Yii 1.1, 2010
Что? Где? Когда?
– Он жив 
– Он развивается.
– Он уже не так сильно далёк от публичной
  альфы… но всё ещё есть над чем поработать,
  поэтому пока никаких дат и прогнозов.

https://github.com/yiisoft/yii2/wiki/Yii2-Development-
Roadmap
—Последний PHP 5.3.x+   —Лучше структура
—Namespace              —Меньше лишних
—PSR-0                   классов
                        —Хорошее осталось




                                 v2
ПРОИЗВОДИТЕЛЬНОСТЬ
Общая
– Лучше 1.1.
– "hello world" для веб в два раза быстрее 1.1
  без APC и на 10—20% быстрее с APC (новый
  PSR-0 загрузчик классов, namespace, меньше
  классов).
AR
– Лучше 1.1.
– AR2 кушает меньше памяти и работает
  быстрее. В режиме asArray значительно.
СТРУКТУРА
Базовые классы
• Object
  – Геттеры/сеттеры (~1.1).
• Component
  – События.
  – Behavior (~1.1).
События
class MyComponent extends yiibaseComponent
{
          public function test($name)
          {
                    $this->trigger('test', new yiibaseEvent($this, $name));
          }

          public function hello($name)
          {
                    echo 'Hello, '.$name.'!';
          }
}

$component = new MyComponent();
$component->on('test', function($event) {
          echo $event->sender->hello($event->data);
});
$component->test('Alex');

// out:

Hello, Alex!
Исключения
ОШИБКИ, ОТЛАДКА, ЛОГ
Ошибки
• Нефатальные ошибки конвертируются в
  исключения.
• Фатальные ошибки ловятся и показываются
  красиво.
• Фатальные ошибки пишутся в лог в
  подавляющем большинстве случаев.
UWDC 2013, Yii2
Перехват фатальных ошибок в PHP
– register_shutdown_function() /
  error_get_last().
– ini_set('display_errors', 0);
– Стек можно получить из XDebug.
– Ошибки нехватки памяти. Резерв.
Особенности конвертирования
       ошибок в исключения
• set_error_handler, кидаем исключение.
• set_exception_handler, обрабатываем.
• Исключения в __toString().
Отладка и лог
• Ошибки пишутся в лог всегда.
• В планах полноценная отладочная
  панелька.
РАСШИРЕНИЯ
Зависимости, сайт
– Composer.
– Официальные расширения.
– Рекомендуемые расширения.
– github/bitbucket.

– Несколько официальных расширений будут
  доступны сразу (Smarty, Twig).
МОДЕЛЬ
Модель
– Больше нет модели формы.
– ArrayAccess.
– Валидация.
– Массовое присваивание.
Модель
class LoginForm extends yiibaseModel
{
     public $username;
     public $password;
}
Массовое присваивание
AR
class User extends yiidbActiveRecord
{
       public function table()
       {
               return 'tbl_user';
       }

       public function scenarios()
       {
              return array(
                      'login' => array('username', 'password'),
                      'register' => array('username', 'email',
'password'),
              );
       }
}
Валидация
function rules() {
 return array(
  // rule applied when corresponding field is "safe"
  array('username', 'length', 'min' => 2),
  array('first_name', 'length', 'min' => 2),
  array('password', 'required'),

  // rule applied when scenario is "signup" no matter if field is "safe" or not
  array('hashcode', 'check', 'on' => 'signup'),
 );
}

function scenarios() {
 return array(
  // on signup allow mass assignment of username
  'signup' => array('username', 'password'),
  'update' => array('username', 'first_name'),
 );
}
РАБОТА С БД
Command
Try {
     $command = $db->createCommand($sql)-
>queryAll();
}
catch(yiidbException) {
  //
}
Query
$query = new Query();
$result = $query->select('*')-
>from('post')->where('id = :id',
array(':id' => 1))->createCommand()-
>query();
AR
$customers = Customer::find()
    ->where(array('status' => 1))
    ->orderBy('age')
    ->all();

$customer = Customer::find(10);

$customer = Customer::find(array('age' =>
30, 'status' => 1));
AR relations
class Customer extends yiidbActiveRecord
{
     public function getOrders()
     {
          return $this->hasMany('Order',
array('customer_id' => 'id'));
     }
}

$customer = Customer::find($id);
$orders = $customer->orders; // $orders is an
array of Order objects
AR link/unlink
$customer = Customer::find(1);
$order = new Order;
$order->subtotal = 100;
$customer->link('orders', $order);
AR scope
class Customer extends yiidbActiveRecord
{
       // ...

      /**
        * @param ActiveQuery $query
        */
      public function active($query)
      {
              $query->andWhere('status = 1');
      }
}

$customers = Customer::find()->active()->all();
AR scope
class Customer extends yiidbActiveRecord
{
       // ...

          /**
           * @param ActiveQuery $query
           * @param integer $age
           */
          public function olderThan($query, $age = 30)
          {
                 $query->andWhere('age > :age', array(':age' =>
$age));
          }
}

$customers = Customer::find()->olderThan(50)->all();
noSQL?
• Всякие варианты кеша.
• Не кэш:
  – Пробуем написать обёртку для Redis.
  – Планируем также пощупать Mongo.
WEB, КОНСОЛЬ, ШАБЛОНЫ
Консольное приложение
– Консольное и веб очень похожи.
– Консольная команда = контроллер.
– Консолька будет цветастая.
– Документация для help из phpdoc.
yiic app
– Как минимум два приложения
  • Простое
  • Посложнее
– Можно сделать свои шаблоны.
1 или 2?



      Работайте на стабильном.
1.1 поддерживается как минимум до
         31 декабря, 2015.
Вопросы?
– http://yiiframework.c
  om/
– https://github.com/yii
  soft/yii2/wiki/Yii2-
  Development-
  Roadmap
– sam@rmcreative.ru
– @sam_dark

More Related Content

UWDC 2013, Yii2

  • 1. v2 Александр Макаров Yii core team Stay.com
  • 2. Yii?  PHP5 MVC. Мощный кеш.  Приятный API. RBAC, авторизация.  DAO, AR, миграции.  Построитель форм. Консоль.  Темы. Обработка ошибок,  Тесты. лог.  Документирован. Gii.  Сообщество.  BSD. CLDR, I18n. Виджеты.
  • 4. Что важно в фреймворке – Легко изучать. – Легко отлаживать и исправлять ошибки. – Не должен мешать вашему коду или любому нормальному стороннему коду. – Отличное сообщество. – Обратно совместимый и стабильный. – Не мешает расширять и настраивать. – Приятен ;)
  • 5. * * * *  2004 2005 2006 2007 2008 2011 Prado, с 2004 → Yii 1.0, 2008 → Yii 1.1, 2010
  • 6. Что? Где? Когда? – Он жив  – Он развивается. – Он уже не так сильно далёк от публичной альфы… но всё ещё есть над чем поработать, поэтому пока никаких дат и прогнозов. https://github.com/yiisoft/yii2/wiki/Yii2-Development- Roadmap
  • 7. —Последний PHP 5.3.x+ —Лучше структура —Namespace —Меньше лишних —PSR-0 классов —Хорошее осталось v2
  • 9. Общая – Лучше 1.1. – "hello world" для веб в два раза быстрее 1.1 без APC и на 10—20% быстрее с APC (новый PSR-0 загрузчик классов, namespace, меньше классов).
  • 10. AR – Лучше 1.1. – AR2 кушает меньше памяти и работает быстрее. В режиме asArray значительно.
  • 12. Базовые классы • Object – Геттеры/сеттеры (~1.1). • Component – События. – Behavior (~1.1).
  • 13. События class MyComponent extends yiibaseComponent { public function test($name) { $this->trigger('test', new yiibaseEvent($this, $name)); } public function hello($name) { echo 'Hello, '.$name.'!'; } } $component = new MyComponent(); $component->on('test', function($event) { echo $event->sender->hello($event->data); }); $component->test('Alex'); // out: Hello, Alex!
  • 16. Ошибки • Нефатальные ошибки конвертируются в исключения. • Фатальные ошибки ловятся и показываются красиво. • Фатальные ошибки пишутся в лог в подавляющем большинстве случаев.
  • 18. Перехват фатальных ошибок в PHP – register_shutdown_function() / error_get_last(). – ini_set('display_errors', 0); – Стек можно получить из XDebug. – Ошибки нехватки памяти. Резерв.
  • 19. Особенности конвертирования ошибок в исключения • set_error_handler, кидаем исключение. • set_exception_handler, обрабатываем. • Исключения в __toString().
  • 20. Отладка и лог • Ошибки пишутся в лог всегда. • В планах полноценная отладочная панелька.
  • 22. Зависимости, сайт – Composer. – Официальные расширения. – Рекомендуемые расширения. – github/bitbucket. – Несколько официальных расширений будут доступны сразу (Smarty, Twig).
  • 24. Модель – Больше нет модели формы. – ArrayAccess. – Валидация. – Массовое присваивание.
  • 25. Модель class LoginForm extends yiibaseModel { public $username; public $password; }
  • 27. AR class User extends yiidbActiveRecord { public function table() { return 'tbl_user'; } public function scenarios() { return array( 'login' => array('username', 'password'), 'register' => array('username', 'email', 'password'), ); } }
  • 28. Валидация function rules() { return array( // rule applied when corresponding field is "safe" array('username', 'length', 'min' => 2), array('first_name', 'length', 'min' => 2), array('password', 'required'), // rule applied when scenario is "signup" no matter if field is "safe" or not array('hashcode', 'check', 'on' => 'signup'), ); } function scenarios() { return array( // on signup allow mass assignment of username 'signup' => array('username', 'password'), 'update' => array('username', 'first_name'), ); }
  • 30. Command Try { $command = $db->createCommand($sql)- >queryAll(); } catch(yiidbException) { // }
  • 31. Query $query = new Query(); $result = $query->select('*')- >from('post')->where('id = :id', array(':id' => 1))->createCommand()- >query();
  • 32. AR $customers = Customer::find() ->where(array('status' => 1)) ->orderBy('age') ->all(); $customer = Customer::find(10); $customer = Customer::find(array('age' => 30, 'status' => 1));
  • 33. AR relations class Customer extends yiidbActiveRecord { public function getOrders() { return $this->hasMany('Order', array('customer_id' => 'id')); } } $customer = Customer::find($id); $orders = $customer->orders; // $orders is an array of Order objects
  • 34. AR link/unlink $customer = Customer::find(1); $order = new Order; $order->subtotal = 100; $customer->link('orders', $order);
  • 35. AR scope class Customer extends yiidbActiveRecord { // ... /** * @param ActiveQuery $query */ public function active($query) { $query->andWhere('status = 1'); } } $customers = Customer::find()->active()->all();
  • 36. AR scope class Customer extends yiidbActiveRecord { // ... /** * @param ActiveQuery $query * @param integer $age */ public function olderThan($query, $age = 30) { $query->andWhere('age > :age', array(':age' => $age)); } } $customers = Customer::find()->olderThan(50)->all();
  • 37. noSQL? • Всякие варианты кеша. • Не кэш: – Пробуем написать обёртку для Redis. – Планируем также пощупать Mongo.
  • 39. Консольное приложение – Консольное и веб очень похожи. – Консольная команда = контроллер. – Консолька будет цветастая. – Документация для help из phpdoc.
  • 40. yiic app – Как минимум два приложения • Простое • Посложнее – Можно сделать свои шаблоны.
  • 41. 1 или 2? Работайте на стабильном. 1.1 поддерживается как минимум до 31 декабря, 2015.
  • 42. Вопросы? – http://yiiframework.c om/ – https://github.com/yii soft/yii2/wiki/Yii2- Development- Roadmap – sam@rmcreative.ru – @sam_dark