SlideShare a Scribd company logo
1 of 27
Разработка на 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

What's hot

Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011
ilyubin
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
Noveo
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
Magecom Ukraine
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
Python Meetup
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Yandex
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Глеб Тарасов
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»
Yandex
 
Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3
Technopark
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
Technopark
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
Alexander Makarov
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
Dmitry Soshnikov
 
Профилирование и оптимизация фреймворков высоконагруженных систем на примере ...
Профилирование и оптимизация фреймворков высоконагруженных систем на примере ...Профилирование и оптимизация фреймворков высоконагруженных систем на примере ...
Профилирование и оптимизация фреймворков высоконагруженных систем на примере ...
MageCloud
 

What's hot (20)

Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Javascript
JavascriptJavascript
Javascript
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander Shumenko
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»
 
Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Профилирование и оптимизация фреймворков высоконагруженных систем на примере ...
Профилирование и оптимизация фреймворков высоконагруженных систем на примере ...Профилирование и оптимизация фреймворков высоконагруженных систем на примере ...
Профилирование и оптимизация фреймворков высоконагруженных систем на примере ...
 

Similar to Yii development

Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
ITmozg
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
Pavel Novitsky
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
Technopark
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 

Similar to Yii development (20)

Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Crazy owl yii1=> yii2
Crazy owl yii1=> yii2Crazy owl yii1=> yii2
Crazy owl yii1=> yii2
 
Кэширование данных с помощью Service Worker
Кэширование данных с помощью Service WorkerКэширование данных с помощью Service Worker
Кэширование данных с помощью Service Worker
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
 
Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляции
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр Кошелев
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Нельзя просто так взять и сделать версионирование API
Нельзя просто так взять и сделать версионирование APIНельзя просто так взять и сделать версионирование API
Нельзя просто так взять и сделать версионирование API
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 

More from MageCloud

Security testing
Security testingSecurity testing
Security testing
MageCloud
 
Project lifecircle
Project lifecircleProject lifecircle
Project lifecircle
MageCloud
 
Management of projects
Management of projectsManagement of projects
Management of projects
MageCloud
 
Magento ecommerce
Magento ecommerceMagento ecommerce
Magento ecommerce
MageCloud
 
Dotnet development
Dotnet developmentDotnet development
Dotnet development
MageCloud
 
Corporate structure project_team
Corporate structure project_teamCorporate structure project_team
Corporate structure project_team
MageCloud
 
Continuous integration
Continuous integrationContinuous integration
Continuous integration
MageCloud
 
Clientside optimization
Clientside optimizationClientside optimization
Clientside optimization
MageCloud
 
Automated testing
Automated testingAutomated testing
Automated testing
MageCloud
 

More from MageCloud (20)

How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...
 
First Steps to Mobile Sites and Apps
First Steps to Mobile Sites and AppsFirst Steps to Mobile Sites and Apps
First Steps to Mobile Sites and Apps
 
Optimizing Magento for Peak Performance
Optimizing Magento for Peak PerformanceOptimizing Magento for Peak Performance
Optimizing Magento for Peak Performance
 
Cloud Based Business Application Development
Cloud Based Business Application DevelopmentCloud Based Business Application Development
Cloud Based Business Application Development
 
Three keys to successful banner ads
Three keys to successful banner adsThree keys to successful banner ads
Three keys to successful banner ads
 
Two Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best PracticesTwo Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best Practices
 
Testing
TestingTesting
Testing
 
Security testing
Security testingSecurity testing
Security testing
 
Project lifecircle
Project lifecircleProject lifecircle
Project lifecircle
 
Management of projects
Management of projectsManagement of projects
Management of projects
 
Magento ecommerce
Magento ecommerceMagento ecommerce
Magento ecommerce
 
Graphics
GraphicsGraphics
Graphics
 
Dotnet development
Dotnet developmentDotnet development
Dotnet development
 
Corporate structure project_team
Corporate structure project_teamCorporate structure project_team
Corporate structure project_team
 
Continuous integration
Continuous integrationContinuous integration
Continuous integration
 
Clientside optimization
Clientside optimizationClientside optimization
Clientside optimization
 
Automated testing
Automated testingAutomated testing
Automated testing
 
Amazon
AmazonAmazon
Amazon
 
Agile
AgileAgile
Agile
 
Webdesign
WebdesignWebdesign
Webdesign
 

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» • События • Поведения