dependency injection, phemto

26
VETMANAGER TEAM 26.4.12 Стр. 1 Dependency Injection(DI), Phemto Романичев Владимир

Upload: vladimir-romanitchev

Post on 22-Jun-2015

633 views

Category:

Self Improvement


0 download

DESCRIPTION

короткий доклад о DI в php и Phemto

TRANSCRIPT

Page 1: Dependency injection, phemto

VETMANAGER TEAM 26.4.12 Стр. 1

Dependency Injection(DI), Phemto

Романичев Владимир

Page 2: Dependency injection, phemto

VETMANAGER TEAM 26.4.12 Стр. 2

Page 3: Dependency injection, phemto

VETMANAGER TEAM 26.4.12 Стр. 3

План

1)Как плохо без Dependency Injection2)Как хорошо с Dependency Injection3)Как плохо с Dependency Injection4)Как хорошо с Phemto5)Как хорошо :)

Page 4: Dependency injection, phemto

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

VETMANAGER TEAM 26.4.12 Стр. 5

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

Page 6: Dependency injection, phemto

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

VETMANAGER TEAM 26.4.12 Стр. 7

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

Page 8: Dependency injection, phemto

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

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

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

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

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

VETMANAGER TEAM 26.4.12 Стр. 13

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

Page 14: Dependency injection, phemto

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

VETMANAGER TEAM 26.4.12 Стр. 15

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

Page 16: Dependency injection, phemto

VETMANAGER TEAM 26.4.12 Стр. 16

Стальной getEntity

protected function getEntity(){ $entity = new StoresRow(); return $entity; }

Page 17: Dependency injection, phemto

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

VETMANAGER TEAM 26.4.12 Стр. 18

getEntity protected function getEntity(){ return $this->_entity; }

Page 19: Dependency injection, phemto

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

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

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

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

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

VETMANAGER TEAM 26.4.12 Стр. 24

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

Page 25: Dependency injection, phemto

VETMANAGER TEAM 26.4.12 Стр. 25

Лучше

Page 26: Dependency injection, phemto

VETMANAGER TEAM 26.4.12 Стр. 26

Спасибо за внимание!