SlideShare une entreprise Scribd logo
1  sur  26
Dependency Injection(DI),
              Phemto
                  Романичев Владимир

VETMANAGER TEAM        26.4.12   Стр. 1
VETMANAGER TEAM   26.4.12   Стр. 2
План
  1)Как плохо без Dependency Injection
  2)Как хорошо с Dependency Injection
  3)Как плохо с Dependency Injection
  4)Как хорошо с Phemto
  5)Как хорошо :)




VETMANAGER TEAM          26.4.12   Стр. 3
Как плохо
 class Stores {
  function add($data){
     $query = 'INSERT INTO stores SET title=?
        , assigned_user_id=?, type=?';
     NDatabase::query($query, array($data['title']
        , $data['assigned_user_id'], $data['type_id']));
  }


Stores::add

VETMANAGER TEAM                 26.4.12   Стр. 4
Как плохо

    Как тестировать?(никак)

    Как работать с несколькими коннектами? (никак)

    Как подменить СУБД?(кое-как)

    Как использовать в другом проекте?(кое-как)

    Как перейти на NoSQL?(никак)




VETMANAGER TEAM             26.4.12   Стр. 5
Делаем инъекцию
class Stores{
   public function __construct($database) {
   }
   function add($data){
     $query = 'INSERT INTO stores SET title=?
             , assigned_user_id=?, type=?';
     $this->_database
             ->query($query, $data);
   }

VETMANAGER TEAM          26.4.12   Стр. 6
Лучше

    Как тестировать?(легко)

    Как работать с несколькими коннектами? (легко)

    Как подменить СУБД?(легче)

    Как использовать в другом проекте?(легче)

    Как перейти на NoSQL?(никак)




VETMANAGER TEAM             26.4.12   Стр. 7
Пишем тест...
              class StoresTest extends
                        PHPUnit_Framework_TestCase
              {
                 function setUp(){
                   $this->dbMock = $this
                              ->getMock('VMDatabase');
                   $this->testObject =
                                   new Stores($this->dbMock
                 }


VETMANAGER TEAM                  26.4.12   Стр. 8
Пишем тест...
            function testAdd(){
              $this->dbMock->expects($this->once())
                    ->method('query')
                    ->with(
                       $this->stringContains("INSERT")
                       , $this->equalTo(array('title', 1, 2))
                    );
              $this->testObject->add($testData);
            }



VETMANAGER TEAM                   26.4.12   Стр. 9
Как плохо с DI
             $stores = new Stores(new VMDatabase());
                  $stores = new Stores(
                      new VMDatabase()
                     , new VMRequest()
                     , new VMSession()
                     , new UserModel()
                     …
                  );


VETMANAGER TEAM                  26.4.12   Стр. 10
Как хорошо с Phemto
public function __construct(VMDatabase $database) {
  $this->_database = $database;
}


require_once 'phemto/phemto.php';
$injector = new Phemto();
$stores = $injector->create('Stores');




VETMANAGER TEAM              26.4.12     Стр. 11
Как хорошо с Phemto2
      public function __construct($database) {
        $this->_database = $database;
      }

   require_once 'phemto/phemto.php';
   $injector = new Phemto();
   $injector->forVariable('database')
         ->willUse(new Reused('VMDatabase'));

   $stores = $injector->create('Stores');


VETMANAGER TEAM               26.4.12   Стр. 12
Лучше

    Как тестировать?(легко)

    Как работать с несколькими коннектами? (легко)

    Как подменить СУБД?(легче)

    Как использовать в другом проекте?(легче)

    Как перейти на NoSQL?(никак)




VETMANAGER TEAM             26.4.12   Стр. 13
ActiveRecord
  class Stores {
     function dataWrap($data){...}
     protected function getEntity(){...}
     function add($data){
       $entity = $this->getEntity();
       $entity->import($this->dataWrap($data));
       $entity->save();
     }



VETMANAGER TEAM              26.4.12   Стр. 14
Лучше?(getEntity)

    Как тестировать?(???)

    Как работать с несколькими коннектами?(???)

    Как подменить СУБД?(легко)

    Как использовать в другом проекте?(???)

    Как перейти на NoSQL?(легко)




VETMANAGER TEAM             26.4.12   Стр. 15
Стальной getEntity
            protected function getEntity(){
              $entity = new StoresRow();
              return $entity;
            }




VETMANAGER TEAM               26.4.12   Стр. 16
Фабричный getEntity
  protected function getEntity(){
    return $this->factory->create('StoresRow');
  }

Тест
$ourMock = $this->getMock('StoresRow');
$factoryMock = $this->expects($this->once())
     ->method('create')
     ->will($this->returnValue($ourMock))

  VETMANAGER TEAM           26.4.12   Стр. 17
getEntity
            protected function getEntity(){
              return $this->_entity;
            }




VETMANAGER TEAM               26.4.12   Стр. 18
Новый Stores
   class Stores {
      public function __construct($entity) {
        $this->_entity = $entity;
      }


   $injector->whenCreating('Stores')
     ->forVariable('entity')
     ->willUse('StoresRow');

VETMANAGER TEAM             26.4.12   Стр. 19
Новый тест Stores
$this->entityMock->expects($this->once())
        ->method('import')
        ->with($this->equalTo($needParam));

$this->entityMock->expects($this->once())
        ->method('save');

$this->testObject->add($testData);



VETMANAGER TEAM           26.4.12    Стр. 20
Наш ActiveRecord
 class StoresRow extends Entity {
    protected $_fields = array ();
    protected $_table = 'stores';
    public function __construct($database) {
      $this->setDB($database);
    }




VETMANAGER TEAM             26.4.12   Стр. 21
Тест ActiveRecord
function testSaveWithoutId(){
  $this->dbMock->expects($this->once())
        ->method('query')
        ->with($this->stringContains("INSERT"));
  $this->testObject->import($testData);
  $this->testObject->save();
}




  VETMANAGER TEAM              26.4.12   Стр. 22
Phemto итог
    #wiring.php
    require_once 'phemto/phemto.php';
    $injector = new Phemto();
    $injector->forVariable('database')
    ->willUse(new Reused('VMDatabase'));
    $injector->whenCreating('Stores')
    ->forVariable('entity')->willUse('StoresRow');
    return $injector;
    #ajax_store.php
    $injector = include 'wiring.php';
    $stores = $injector->create('Stores');

VETMANAGER TEAM                26.4.12   Стр. 23
Лучше

    Как тестировать?(легко)

    Как работать с несколькими коннектами? (легко)

    Как подменить СУБД?(легко)

    Как использовать в другом проекте?(легко)

    Как перейти на NoSQL?(легко)




VETMANAGER TEAM             26.4.12   Стр. 24
Лучше




VETMANAGER TEAM           26.4.12   Стр. 25
Спасибо за внимание!




VETMANAGER TEAM       26.4.12   Стр. 26

Contenu connexe

Tendances

Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7Eugene Fidelin
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.jsMad Devs
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь ЧертенковImprove Group
 
Управление файловым сервером с помощью PowerShell
Управление файловым сервером с помощью PowerShellУправление файловым сервером с помощью PowerShell
Управление файловым сервером с помощью PowerShellAndrey Markin
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Руководство по управлению службами WIindows с помощью PowerShell
Руководство по управлению службами WIindows с помощью PowerShellРуководство по управлению службами WIindows с помощью PowerShell
Руководство по управлению службами WIindows с помощью PowerShellAndrey Markin
 
Выжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим ГопейВыжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим ГопейEatDog
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый стартAntonio
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвMail.ru Group
 
DevHub 3 - Pricing
DevHub 3 - PricingDevHub 3 - Pricing
DevHub 3 - PricingMagento Dev
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoIlya Shalyapin
 
10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shellAndrey Markin
 

Tendances (18)

Yii development
Yii developmentYii development
Yii development
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.js
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
 
Управление файловым сервером с помощью PowerShell
Управление файловым сервером с помощью PowerShellУправление файловым сервером с помощью PowerShell
Управление файловым сервером с помощью PowerShell
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Survive with OOP
Survive with OOPSurvive with OOP
Survive with OOP
 
Руководство по управлению службами WIindows с помощью PowerShell
Руководство по управлению службами WIindows с помощью PowerShellРуководство по управлению службами WIindows с помощью PowerShell
Руководство по управлению службами WIindows с помощью PowerShell
 
Выжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим ГопейВыжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим Гопей
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый старт
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
DevHub 3 - Pricing
DevHub 3 - PricingDevHub 3 - Pricing
DevHub 3 - Pricing
 
лабраб 7
лабраб 7лабраб 7
лабраб 7
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и Django
 
10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell
 

Similaire à Dependency injection, phemto

Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customersaheadWorks
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debuggingaheadWorks
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капляmeet_magento
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнDevDay
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Опыт разработки эффективного SPA
Опыт разработки эффективного SPAОпыт разработки эффективного SPA
Опыт разработки эффективного SPAEugene Abrosimov
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in MagentoVrann Tulika
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15MoscowJS
 
Everything You Need to Know About WP_Query, WordCamp Russia 2014
Everything You Need to Know About WP_Query, WordCamp Russia 2014Everything You Need to Know About WP_Query, WordCamp Russia 2014
Everything You Need to Know About WP_Query, WordCamp Russia 2014Sergey Biryukov
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн2ГИС Технологии
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
 
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013Dmytro Zharii
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловGeeksLab Odessa
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
 
"Ractive.js — реактивные усы!" Ефим Соловьев, MoscowJS 17
"Ractive.js — реактивные усы!" Ефим Соловьев, MoscowJS 17"Ractive.js — реактивные усы!" Ефим Соловьев, MoscowJS 17
"Ractive.js — реактивные усы!" Ефим Соловьев, MoscowJS 17MoscowJS
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyEvgeny Kompaniyets
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном кодеKolya Korobochkin
 

Similaire à Dependency injection, phemto (20)

Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customers
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-Онлайн
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Опыт разработки эффективного SPA
Опыт разработки эффективного SPAОпыт разработки эффективного SPA
Опыт разработки эффективного SPA
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in Magento
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
Everything You Need to Know About WP_Query, WordCamp Russia 2014
Everything You Need to Know About WP_Query, WordCamp Russia 2014Everything You Need to Know About WP_Query, WordCamp Russia 2014
Everything You Need to Know About WP_Query, WordCamp Russia 2014
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
 
За пределами PageObject
За пределами PageObjectЗа пределами PageObject
За пределами PageObject
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
Render API.
Render API.Render API.
Render API.
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
"Ractive.js — реактивные усы!" Ефим Соловьев, MoscowJS 17
"Ractive.js — реактивные усы!" Ефим Соловьев, MoscowJS 17"Ractive.js — реактивные усы!" Ефим Соловьев, MoscowJS 17
"Ractive.js — реактивные усы!" Ефим Соловьев, MoscowJS 17
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря Groovy
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном коде
 

Dependency injection, phemto

  • 1. Dependency Injection(DI), Phemto Романичев Владимир VETMANAGER TEAM 26.4.12 Стр. 1
  • 2. VETMANAGER TEAM 26.4.12 Стр. 2
  • 3. План 1)Как плохо без Dependency Injection 2)Как хорошо с Dependency Injection 3)Как плохо с Dependency Injection 4)Как хорошо с Phemto 5)Как хорошо :) VETMANAGER TEAM 26.4.12 Стр. 3
  • 4. Как плохо class Stores { function add($data){ $query = 'INSERT INTO stores SET title=? , assigned_user_id=?, type=?'; NDatabase::query($query, array($data['title'] , $data['assigned_user_id'], $data['type_id'])); } Stores::add VETMANAGER TEAM 26.4.12 Стр. 4
  • 5. Как плохо  Как тестировать?(никак)  Как работать с несколькими коннектами? (никак)  Как подменить СУБД?(кое-как)  Как использовать в другом проекте?(кое-как)  Как перейти на NoSQL?(никак) VETMANAGER TEAM 26.4.12 Стр. 5
  • 6. Делаем инъекцию class Stores{ public function __construct($database) { } function add($data){ $query = 'INSERT INTO stores SET title=? , assigned_user_id=?, type=?'; $this->_database ->query($query, $data); } VETMANAGER TEAM 26.4.12 Стр. 6
  • 7. Лучше  Как тестировать?(легко)  Как работать с несколькими коннектами? (легко)  Как подменить СУБД?(легче)  Как использовать в другом проекте?(легче)  Как перейти на NoSQL?(никак) VETMANAGER TEAM 26.4.12 Стр. 7
  • 8. Пишем тест... class StoresTest extends PHPUnit_Framework_TestCase { function setUp(){ $this->dbMock = $this ->getMock('VMDatabase'); $this->testObject = new Stores($this->dbMock } VETMANAGER TEAM 26.4.12 Стр. 8
  • 9. Пишем тест... function testAdd(){ $this->dbMock->expects($this->once()) ->method('query') ->with( $this->stringContains("INSERT") , $this->equalTo(array('title', 1, 2)) ); $this->testObject->add($testData); } VETMANAGER TEAM 26.4.12 Стр. 9
  • 10. Как плохо с DI $stores = new Stores(new VMDatabase()); $stores = new Stores( new VMDatabase() , new VMRequest() , new VMSession() , new UserModel() … ); VETMANAGER TEAM 26.4.12 Стр. 10
  • 11. Как хорошо с Phemto public function __construct(VMDatabase $database) { $this->_database = $database; } require_once 'phemto/phemto.php'; $injector = new Phemto(); $stores = $injector->create('Stores'); VETMANAGER TEAM 26.4.12 Стр. 11
  • 12. Как хорошо с Phemto2 public function __construct($database) { $this->_database = $database; } require_once 'phemto/phemto.php'; $injector = new Phemto(); $injector->forVariable('database') ->willUse(new Reused('VMDatabase')); $stores = $injector->create('Stores'); VETMANAGER TEAM 26.4.12 Стр. 12
  • 13. Лучше  Как тестировать?(легко)  Как работать с несколькими коннектами? (легко)  Как подменить СУБД?(легче)  Как использовать в другом проекте?(легче)  Как перейти на NoSQL?(никак) VETMANAGER TEAM 26.4.12 Стр. 13
  • 14. ActiveRecord class Stores { function dataWrap($data){...} protected function getEntity(){...} function add($data){ $entity = $this->getEntity(); $entity->import($this->dataWrap($data)); $entity->save(); } VETMANAGER TEAM 26.4.12 Стр. 14
  • 15. Лучше?(getEntity)  Как тестировать?(???)  Как работать с несколькими коннектами?(???)  Как подменить СУБД?(легко)  Как использовать в другом проекте?(???)  Как перейти на NoSQL?(легко) VETMANAGER TEAM 26.4.12 Стр. 15
  • 16. Стальной getEntity protected function getEntity(){ $entity = new StoresRow(); return $entity; } VETMANAGER TEAM 26.4.12 Стр. 16
  • 17. Фабричный getEntity protected function getEntity(){ return $this->factory->create('StoresRow'); } Тест $ourMock = $this->getMock('StoresRow'); $factoryMock = $this->expects($this->once()) ->method('create') ->will($this->returnValue($ourMock)) VETMANAGER TEAM 26.4.12 Стр. 17
  • 18. getEntity protected function getEntity(){ return $this->_entity; } VETMANAGER TEAM 26.4.12 Стр. 18
  • 19. Новый Stores class Stores { public function __construct($entity) { $this->_entity = $entity; } $injector->whenCreating('Stores') ->forVariable('entity') ->willUse('StoresRow'); VETMANAGER TEAM 26.4.12 Стр. 19
  • 20. Новый тест Stores $this->entityMock->expects($this->once()) ->method('import') ->with($this->equalTo($needParam)); $this->entityMock->expects($this->once()) ->method('save'); $this->testObject->add($testData); VETMANAGER TEAM 26.4.12 Стр. 20
  • 21. Наш ActiveRecord class StoresRow extends Entity { protected $_fields = array (); protected $_table = 'stores'; public function __construct($database) { $this->setDB($database); } VETMANAGER TEAM 26.4.12 Стр. 21
  • 22. Тест ActiveRecord function testSaveWithoutId(){ $this->dbMock->expects($this->once()) ->method('query') ->with($this->stringContains("INSERT")); $this->testObject->import($testData); $this->testObject->save(); } VETMANAGER TEAM 26.4.12 Стр. 22
  • 23. Phemto итог #wiring.php require_once 'phemto/phemto.php'; $injector = new Phemto(); $injector->forVariable('database') ->willUse(new Reused('VMDatabase')); $injector->whenCreating('Stores') ->forVariable('entity')->willUse('StoresRow'); return $injector; #ajax_store.php $injector = include 'wiring.php'; $stores = $injector->create('Stores'); VETMANAGER TEAM 26.4.12 Стр. 23
  • 24. Лучше  Как тестировать?(легко)  Как работать с несколькими коннектами? (легко)  Как подменить СУБД?(легко)  Как использовать в другом проекте?(легко)  Как перейти на NoSQL?(легко) VETMANAGER TEAM 26.4.12 Стр. 24
  • 25. Лучше VETMANAGER TEAM 26.4.12 Стр. 25