dependency injection, phemto
DESCRIPTION
короткий доклад о DI в php и PhemtoTRANSCRIPT
![Page 1: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/1.jpg)
VETMANAGER TEAM 26.4.12 Стр. 1
Dependency Injection(DI), Phemto
Романичев Владимир
![Page 2: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/2.jpg)
VETMANAGER TEAM 26.4.12 Стр. 2
![Page 3: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/3.jpg)
VETMANAGER TEAM 26.4.12 Стр. 3
План
1)Как плохо без Dependency Injection2)Как хорошо с Dependency Injection3)Как плохо с Dependency Injection4)Как хорошо с Phemto5)Как хорошо :)
![Page 4: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/4.jpg)
VETMANAGER TEAM 26.4.12 Стр. 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
![Page 5: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/5.jpg)
VETMANAGER TEAM 26.4.12 Стр. 5
Как плохо Как тестировать?(никак) Как работать с несколькими коннектами? (никак) Как подменить СУБД?(кое-как) Как использовать в другом проекте?(кое-как) Как перейти на NoSQL?(никак)
![Page 6: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/6.jpg)
VETMANAGER TEAM 26.4.12 Стр. 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); }
![Page 7: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/7.jpg)
VETMANAGER TEAM 26.4.12 Стр. 7
Лучше Как тестировать?(легко) Как работать с несколькими коннектами? (легко) Как подменить СУБД?(легче) Как использовать в другом проекте?(легче) Как перейти на NoSQL?(никак)
![Page 8: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/8.jpg)
VETMANAGER TEAM 26.4.12 Стр. 8
Пишем тест...class StoresTest extends
PHPUnit_Framework_TestCase{ function setUp(){ $this->dbMock = $this
->getMock('VMDatabase'); $this->testObject =
new Stores($this->dbMock); }
![Page 9: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/9.jpg)
VETMANAGER TEAM 26.4.12 Стр. 9
Пишем тест... function testAdd(){ $this->dbMock->expects($this->once()) ->method('query') ->with( $this->stringContains("INSERT") , $this->equalTo(array('title', 1, 2)) ); $this->testObject->add($testData); }
![Page 10: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/10.jpg)
VETMANAGER TEAM 26.4.12 Стр. 10
Как плохо с DI
$stores = new Stores(new VMDatabase());
$stores = new Stores(new VMDatabase()
, new VMRequest() , new VMSession() , new UserModel() …);
![Page 11: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/11.jpg)
VETMANAGER TEAM 26.4.12 Стр. 11
Как хорошо с Phemto public function __construct(VMDatabase $database) { $this->_database = $database; }
require_once 'phemto/phemto.php';$injector = new Phemto();$stores = $injector->create('Stores');
![Page 12: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/12.jpg)
VETMANAGER TEAM 26.4.12 Стр. 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');
![Page 13: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/13.jpg)
VETMANAGER TEAM 26.4.12 Стр. 13
Лучше Как тестировать?(легко) Как работать с несколькими коннектами? (легко) Как подменить СУБД?(легче) Как использовать в другом проекте?(легче) Как перейти на NoSQL?(никак)
![Page 14: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/14.jpg)
VETMANAGER TEAM 26.4.12 Стр. 14
ActiveRecordclass Stores { function dataWrap($data){...} protected function getEntity(){...} function add($data){ $entity = $this->getEntity(); $entity->import($this->dataWrap($data)); $entity->save(); }
![Page 15: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/15.jpg)
VETMANAGER TEAM 26.4.12 Стр. 15
Лучше?(getEntity) Как тестировать?(???) Как работать с несколькими коннектами?(???) Как подменить СУБД?(легко) Как использовать в другом проекте?(???) Как перейти на NoSQL?(легко)
![Page 16: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/16.jpg)
VETMANAGER TEAM 26.4.12 Стр. 16
Стальной getEntity
protected function getEntity(){ $entity = new StoresRow(); return $entity; }
![Page 17: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/17.jpg)
VETMANAGER TEAM 26.4.12 Стр. 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))
![Page 18: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/18.jpg)
VETMANAGER TEAM 26.4.12 Стр. 18
getEntity protected function getEntity(){ return $this->_entity; }
![Page 19: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/19.jpg)
VETMANAGER TEAM 26.4.12 Стр. 19
Новый Storesclass Stores { public function __construct($entity) { $this->_entity = $entity; }
$injector->whenCreating('Stores')->forVariable('entity')->willUse('StoresRow');
![Page 20: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/20.jpg)
VETMANAGER TEAM 26.4.12 Стр. 20
Новый тест Stores$this->entityMock->expects($this->once()) ->method('import') ->with($this->equalTo($needParam));
$this->entityMock->expects($this->once()) ->method('save');
$this->testObject->add($testData);
![Page 21: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/21.jpg)
VETMANAGER TEAM 26.4.12 Стр. 21
Наш ActiveRecordclass StoresRow extends Entity { protected $_fields = array (); protected $_table = 'stores'; public function __construct($database) { $this->setDB($database); }
![Page 22: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/22.jpg)
VETMANAGER TEAM 26.4.12 Стр. 22
Тест ActiveRecordfunction testSaveWithoutId(){ $this->dbMock->expects($this->once()) ->method('query') ->with($this->stringContains("INSERT")); $this->testObject->import($testData); $this->testObject->save();}
![Page 23: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/23.jpg)
VETMANAGER TEAM 26.4.12 Стр. 23
Phemto итог#wiring.phprequire_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');
![Page 24: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/24.jpg)
VETMANAGER TEAM 26.4.12 Стр. 24
Лучше Как тестировать?(легко) Как работать с несколькими коннектами? (легко) Как подменить СУБД?(легко) Как использовать в другом проекте?(легко) Как перейти на NoSQL?(легко)
![Page 25: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/25.jpg)
VETMANAGER TEAM 26.4.12 Стр. 25
Лучше
![Page 26: Dependency injection, phemto](https://reader036.vdocuments.net/reader036/viewer/2022062319/55878a50d8b42a3c318b46d8/html5/thumbnails/26.jpg)
VETMANAGER TEAM 26.4.12 Стр. 26
Спасибо за внимание!