2. Dependency Inversion
SOLID
High-level modules should not depend on
low-level modules. Both should depend
on abstractions.
http://en.wikipedia.org/wiki/Dependency_inversion_principle
4. class UserModify {
public function __constructor() {
$this->storage = new MysqlStorage();
}
public function modify($data) {
$result = $this->storage->save($data);
return $result;
}
}
⾼高階直接依賴低階
5.
6. class UserModify {
public function __constructor(DataStorageInterface $storage) {
$this->storage = $storage;
}
public function modify($data) {
$result = $this->storage->save($data);
return $result;
}
}
class MysqlStorage implements DataStorageInterface {
public function save($data){ // …. }
}
interface DataStorageInterface {
public function save(array $data);
}
Abstraction
Low Level Module
Hight Level Module
10. 容易抽換實作
class UserModify {
public function __constructor(DataStorageInterface $storage) {
$this->storage = $storage;
}
}
class SqliteStorage implements DataStorageInterface {
public function save($data){ // …. }
}
SqliteStorage Instance
11. 讓測試變容易
class DummyStorage implements DataStorageInterface {
public function save() { return ‘Success’; }
}
class UserModify {
public function modify($data) {
return $this->storage->save($data);
}
}
class UserModifyTest {
public function it_return_new_instance_after_modify($data) {
$instance = new UserModify(new DummyStorage);
$result = $instance->modify();
assert($result, ‘Success’);
}
}
21. Service Container
The Laravel service container is a powerful tool
for managing class dependencies. Dependency
injection is a fancy word that essentially means
this: class dependencies are "injected" into the
class via the constructor or, in some cases,
"setter" methods.
http://laravel.com/docs/5.0/container
22. Trace initialize of service container ( IlluminateFoundationApplication )
IlluminateFoundationApplication::__construct
IlluminateFoundationApplication::registerBaseBindings
IlluminateFoundationApplication::registerBaseServiceProviders
IlluminateFoundationApplication::registerCoreContainerAliases
23. Trace register of IlluminateContractsHttpKernel
bootstrap/app.php
$app->singleton(‘IlluminateContractsHttpKernel', 'AppHttpKernel');
IlluminateFoundationApplication::singleton
IlluminateFoundationApplication::bind
24. Trace how to use IlluminateContractsHttpKernel
$kernel = $app->make('IlluminateContractsHttpKernel');
public/index.php
IlluminateFoundationApplication::make
IlluminateContainerContainer::make
IlluminateContainerContainer::build