Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Разработка на Yii
               Системный архитектор
                       Климов П.В.




     QuartSoft Corp.
Yii – PHP Framework

Основные характеристики:
•   ООП
•   Модульность
•   Простота
•   Высокое быстродействие
Истоки Yii:

•   Prado
•   Ruby on Rails
•   jQuery
•   Symfony
•   Joomla
Магия в PHP
class Component {
   public $publicProperty;
   protected $_protectedProperty;

    public function setProtectedProperty($value) {
      $this->_protectedProperty = $value;
      return true;
    }

    public function getProtectedProperty() {
      return $this->_protectedProperty;
    }
}
class Component {

  public function __get($propertyName) {
    $methodName = 'get'.$propertyName;
    if (method_exists($this, $methodName)) {
        return call_user_func( array($this, $methodName) );
    } else {
        throw new Exception("Missing property {$propertyName}'!");
    }
  }

  public function __set($propertyName, $value) {
    $methodName = 'set'.$propertyName;
    if (method_exists($this, $methodName)) {
        return call_user_func( array($this, $methodName), $value );
    } else {
        throw new Exception("Missing property {$propertyName}'!");
    }
  }
$component = new Component();

$component->publicProperty = 'Public value';
echo($component->publicProperty);

$component->protectedProperty = 'Protected value';
echo($component->protectedProperty);
Автозагрузка классов
Подключение файлов по принципу DLL:

require_once('components/SomeClass.php');
$someObj = new SomeClass();
…
require_once('components/OtherClass.php');
$otherObj = new OtherClass();
…
require_once('components/SomeClass.php');
$anotherSomeObj = new SomeClass();
class Autoloader {
  public function autoload($className) {
    $classFileName = ‘components/'.$className.'.php';
    if (file_exists($classFileName)) {
        require_once($classFileName);
        return true;
    }
    return false;
  }

    public function register() {
      return spl_autoload_register( array($this, 'autoload') );
    }

    public function __construct() {
      $this->register();
    }
}
Автозагрузка классов в контексте Yii:
 Yii::import(‘application.components.SomeClass');
 Yii::import(‘application.components.OtherClass');
 …
 $someObj = new SomeClass();



 «Карта» автозагрузки классов:
‘SomeComponent’ => ‘/home/www/…/components/SomeClass.php’,
‘OtherComponent’ => ‘/home/www/…/components/OtherClass.php’,
Порождение компонентов
function createComponent(array $componentConfig) {
    $className = $componentConfig['class'];
    if (empty($className)) {
        throw new Exception(‘Missing parameter "class"!');
    }
    unset($componentConfig['class']);
    if (!class_exists($className)) {
        Yii::import($className); // Автозагрузка
    }
    $component = new $className();
    foreach($componentConfig as $name=>$value) {
        $component->$name = $value; // Конфигурация
    }
    return $component;
}
Задание любого объекта через массив:
$componentConfig = array(
   'class'=>'CUrlManager',
   'urlFormat'=>'path',
   'showScriptName'=>false,
   'rules'=>array(
      '/'=>'site/index',
      '<controller:w+>/<id:d+>*'=>'<controller>/view',
   ),
);

$component = createComponent($componentConfig);
Фабрика компонентов
                    “Request component
                    by name”
     Factory                                Client
$componentsConfig
$components             “Create and store
                    1   by name”
createComponent()                  *   Component
getComponent()




  ComponentA            ComponentB               …
Одиночка (Singleton)
class Singleton {
  private static $_selfInstance = null;

    public static function getInstance() {
      if (!is_object(self::$_selfInstance)) {
          self::$_selfInstance = new Singleton();
      }
      return self::$_selfInstance;
    }

    private function __construct() {
      // закрытый конструктор
    }
}

$singleton = Singleton::getInstance();
Фабрика компонентов(Component Factory)


                   +
          Одиночка (Singleton)


                   =
     Приложение Yii (Yii Application)
$config = array(
   'name'=>'My Web Application',
   …
   'components'=>array(
        'user'=>array(
              'allowAutoLogin'=>true,
        ),
        …
   ),
);
Yii::createWebApplication($config)->run();
…
$application = Yii::app();
$user = Yii::app()->getComponent(‘user’);
MVC в Yii
 Application
Components         Application



                   Controller



                    Widget

        Model                    View
Маршрутизация web запроса
             :Application
Apache
            ‘run’
                            :Request
                    ‘get request’

                     ‘request’

                                             :UrlManager
                    ‘get route by request’

                     ‘controller/action’

                                                           :Controller
                                     ‘run action’
         ‘output’
Доступ к базе данных через
           PDO
                   1      1
 Client      PDO                PDO Driver




 PDO MySQL     PDO PostgreSQL           …



   MySQL           PostgreSQL
Абстракция базы данных
         1   1
PDO              DbConnection            “Control
                                     1   information”



                        “Compose
                      and execute               1
                          queries”
Client       DbCommand               DbSchema
                         *      1



Schema MySQL        Schema PostgreSQL                   …
Active Record
            “Find self instances”     1                           1
Client                                      ActiveFinder

               *                          find()
          ActiveRecord                    populateRecord()
                                                      1
                                    “Instantiate by
         insert()
                                    query result”
         update()
         delete()              *                          “Database
                                                          access”
               1
                              *           DbCommand           *
               “Database access”
$allUsers = User::model()->findAll();

$newUser = new User();
$newUser->name = ‘new user’;
$newUser->save();

$existingUser = User::model()->findByName(‘testuser’);
$existingUser->email = ‘newemail@domain.com’;
$existingUser->save();
События (Events) в Yii
                    1
  Component
                            “Raise”
                                       *     Event
eventHandlers                              sender
                                           data
raiseEvent()
                                              1
    1                        PHP                    “Handle”
                            Callback
                                              *
                                            Handler
         “List of PHP callbacks”
                                                    *
function handleBeforeSave(CEvent $event) {
  $sender = $event->sender;
  // Изменяем состояние отправителя события:
  $sender->create_date = date('Y-m-d H:i:s', strtotime('NOW'));
}

$user = new User();
// Назначаем обработчик события:
$user->onBeforeSave = ‘handleBeforeSave’;
$user->name = ‘test name’;
$user->save();

echo $user->create_date; // Вывод: ‘2012-03-22 16:42’
Проблема множественного
     наследования
                      ActiveRecord




   ArPosition                                    ArFile
Save custom records                       Bind physical file with
display order                             the db record




                      ArPositionFile
                        Position + File
Поведение (Behavior)
                    1
 Component                        *      Behavior
behaviors                             owner
__call()                              getOwner()
attachBehavior()                      events()

      1                                       1
                    *     Event   *
          “Raise”                     “Handle”
                        data
class ArBehaviorExample extends CBehavior {
  public function behaviorMethod() {
    $owner = $this->getOwner();
    $owner->create_date = date('Y-m-d H:i:s', strtotime('NOW'));
  }
}

$user = new User();
// Добавляем поведение:
$behavior = new ArBehaviorExample();
$user->attachBehavior($behavior);

// Вызываем метод поведения:
$user->behaviorMethod();
echo $user->create_date; // Вывод: ‘2012-03-22 16:46’
Yii
•   Динамический код
•   Компонентная структура
•   Приложение = «одиночка» + «фабрика»
•   Отложенная загрузка и создание
    объектов
•   MVC
•   «PDO» и «Active Record»
•   События
•   Поведения

More Related Content

Yii development

  • 1. Разработка на Yii Системный архитектор Климов П.В. QuartSoft Corp.
  • 2. Yii – PHP Framework Основные характеристики: • ООП • Модульность • Простота • Высокое быстродействие
  • 3. Истоки Yii: • Prado • Ruby on Rails • jQuery • Symfony • Joomla
  • 4. Магия в PHP class Component { public $publicProperty; protected $_protectedProperty; public function setProtectedProperty($value) { $this->_protectedProperty = $value; return true; } public function getProtectedProperty() { return $this->_protectedProperty; } }
  • 5. class Component { public function __get($propertyName) { $methodName = 'get'.$propertyName; if (method_exists($this, $methodName)) { return call_user_func( array($this, $methodName) ); } else { throw new Exception("Missing property {$propertyName}'!"); } } public function __set($propertyName, $value) { $methodName = 'set'.$propertyName; if (method_exists($this, $methodName)) { return call_user_func( array($this, $methodName), $value ); } else { throw new Exception("Missing property {$propertyName}'!"); } }
  • 6. $component = new Component(); $component->publicProperty = 'Public value'; echo($component->publicProperty); $component->protectedProperty = 'Protected value'; echo($component->protectedProperty);
  • 7. Автозагрузка классов Подключение файлов по принципу DLL: require_once('components/SomeClass.php'); $someObj = new SomeClass(); … require_once('components/OtherClass.php'); $otherObj = new OtherClass(); … require_once('components/SomeClass.php'); $anotherSomeObj = new SomeClass();
  • 8. class Autoloader { public function autoload($className) { $classFileName = ‘components/'.$className.'.php'; if (file_exists($classFileName)) { require_once($classFileName); return true; } return false; } public function register() { return spl_autoload_register( array($this, 'autoload') ); } public function __construct() { $this->register(); } }
  • 9. Автозагрузка классов в контексте Yii: Yii::import(‘application.components.SomeClass'); Yii::import(‘application.components.OtherClass'); … $someObj = new SomeClass(); «Карта» автозагрузки классов: ‘SomeComponent’ => ‘/home/www/…/components/SomeClass.php’, ‘OtherComponent’ => ‘/home/www/…/components/OtherClass.php’,
  • 10. Порождение компонентов function createComponent(array $componentConfig) { $className = $componentConfig['class']; if (empty($className)) { throw new Exception(‘Missing parameter "class"!'); } unset($componentConfig['class']); if (!class_exists($className)) { Yii::import($className); // Автозагрузка } $component = new $className(); foreach($componentConfig as $name=>$value) { $component->$name = $value; // Конфигурация } return $component; }
  • 11. Задание любого объекта через массив: $componentConfig = array( 'class'=>'CUrlManager', 'urlFormat'=>'path', 'showScriptName'=>false, 'rules'=>array( '/'=>'site/index', '<controller:w+>/<id:d+>*'=>'<controller>/view', ), ); $component = createComponent($componentConfig);
  • 12. Фабрика компонентов “Request component by name” Factory Client $componentsConfig $components “Create and store 1 by name” createComponent() * Component getComponent() ComponentA ComponentB …
  • 13. Одиночка (Singleton) class Singleton { private static $_selfInstance = null; public static function getInstance() { if (!is_object(self::$_selfInstance)) { self::$_selfInstance = new Singleton(); } return self::$_selfInstance; } private function __construct() { // закрытый конструктор } } $singleton = Singleton::getInstance();
  • 14. Фабрика компонентов(Component Factory) + Одиночка (Singleton) = Приложение Yii (Yii Application)
  • 15. $config = array( 'name'=>'My Web Application', … 'components'=>array( 'user'=>array( 'allowAutoLogin'=>true, ), … ), ); Yii::createWebApplication($config)->run(); … $application = Yii::app(); $user = Yii::app()->getComponent(‘user’);
  • 16. MVC в Yii Application Components Application Controller Widget Model View
  • 17. Маршрутизация web запроса :Application Apache ‘run’ :Request ‘get request’ ‘request’ :UrlManager ‘get route by request’ ‘controller/action’ :Controller ‘run action’ ‘output’
  • 18. Доступ к базе данных через PDO 1 1 Client PDO PDO Driver PDO MySQL PDO PostgreSQL … MySQL PostgreSQL
  • 19. Абстракция базы данных 1 1 PDO DbConnection “Control 1 information” “Compose and execute 1 queries” Client DbCommand DbSchema * 1 Schema MySQL Schema PostgreSQL …
  • 20. Active Record “Find self instances” 1 1 Client ActiveFinder * find() ActiveRecord populateRecord() 1 “Instantiate by insert() query result” update() delete() * “Database access” 1 * DbCommand * “Database access”
  • 21. $allUsers = User::model()->findAll(); $newUser = new User(); $newUser->name = ‘new user’; $newUser->save(); $existingUser = User::model()->findByName(‘testuser’); $existingUser->email = ‘newemail@domain.com’; $existingUser->save();
  • 22. События (Events) в Yii 1 Component “Raise” * Event eventHandlers sender data raiseEvent() 1 1 PHP “Handle” Callback * Handler “List of PHP callbacks” *
  • 23. function handleBeforeSave(CEvent $event) { $sender = $event->sender; // Изменяем состояние отправителя события: $sender->create_date = date('Y-m-d H:i:s', strtotime('NOW')); } $user = new User(); // Назначаем обработчик события: $user->onBeforeSave = ‘handleBeforeSave’; $user->name = ‘test name’; $user->save(); echo $user->create_date; // Вывод: ‘2012-03-22 16:42’
  • 24. Проблема множественного наследования ActiveRecord ArPosition ArFile Save custom records Bind physical file with display order the db record ArPositionFile Position + File
  • 25. Поведение (Behavior) 1 Component * Behavior behaviors owner __call() getOwner() attachBehavior() events() 1 1 * Event * “Raise” “Handle” data
  • 26. class ArBehaviorExample extends CBehavior { public function behaviorMethod() { $owner = $this->getOwner(); $owner->create_date = date('Y-m-d H:i:s', strtotime('NOW')); } } $user = new User(); // Добавляем поведение: $behavior = new ArBehaviorExample(); $user->attachBehavior($behavior); // Вызываем метод поведения: $user->behaviorMethod(); echo $user->create_date; // Вывод: ‘2012-03-22 16:46’
  • 27. Yii • Динамический код • Компонентная структура • Приложение = «одиночка» + «фабрика» • Отложенная загрузка и создание объектов • MVC • «PDO» и «Active Record» • События • Поведения