依赖注入是敏捷架构中关键元素。
class UserProvider{
protected $connection;
public function __construct(){
$this->connection = new Connection;
}
public function retrieveByCredentials( array $credentials ){
$user = $this->connection
->where( ‘email‘, $credentials[‘email‘])
->where( ‘password‘, $credentials[‘password‘])
->first();
return $user;
}
}
如果你要测试或者维护这个类,你必须访问数据库的实例来进行一些查询。为了避免必须这样做,你可以将此类与其他类进行 解耦 ,你有三个选项之一,可以将 Connection 类注入而不需要直接使用它。将组件注入类时,可以使用以下三个选项之一:
class UserProvider{
protected $connection;
public function __construct( Connection $con ){
$this->connection = $con;
}
...
class UserProvider{
protected $connection;
public function __construct(){
...
}
public function setConnection( Connection $con ){
$this->connection = $con;
}
...
interface ConnectionInjector{
public function injectConnection( Connection $con );
}
class UserProvider implements ConnectionInjector{
protected $connection;
public function __construct(){
...
}
public function injectConnection( Connection $con ){
$this->connection = $con;
}
}
class FileSessionStorage{
public function __construct(){
session_start();
}
public function get( $key ){
return $_SESSION[$key];
}
public function set( $key, $value ){
$_SESSION[$key] = $value;
}
}
class SimpleAuth{
protected $session;
public function __construct(){
$this->session = new FileSessionStorage;
}
}
//创建一个 SimpleAuth
$auth = new SimpleAuth();
这是一种经典的方法,让我们从使用构造函数注入开始。
class SimpleAuth{
protected $session;
public function __construct( FileSessionStorage $session ){
$this->session = $session;
}
}
现在我们创建一个对象:
$auth = new SimpleAuth( new FileSessionStorage() );
App::bind( ‘FileSessionStorage‘, function(){
return new FileSessionStorage;
});
class MysqlSessionStorage{
public function __construct(){
//...
}
public function get($key){
// do something
}
public function set( $key, $value ){
// do something
}
}
高级模块不应该依赖于低级模块,两者都应该依赖于抽象对象。 抽象不应该依赖于细节,细节应该取决于抽象。 Robert C. Martin
interface SessionStorage{
public function get( $key );
public function set( $key, $value );
}
这样我们就可以实现并请求 SessionStorage 接口的实例:
class FileSessionStorage implements SessionStorage{
public function __construct(){
//...
}
public function get( $key ){
//...
}
public function set( $key, $value ){
//...
}
}
class MysqlSessionStorage implements SessionStorage{
public function __construct(){
//...
}
public function get( $key ){
//...
}
public function set( $key, $value ){
//...
}
}
class SimpleAuth{
protected $session;
public function __construct( SessionStorage $session ){
$this->session = $session;
}
}
Uncaught exception ‘Illuminate\Container\BindingResolutionException‘ with message ‘Target [SessionStorage] is not instantiable.‘
容器正试图将接口实例化。我们可以为该接口做一个具体的绑定。
App:bind( ‘SessionStorage‘, ‘MysqlSessionStorage‘ );
更多学习内容请访问:
原文:https://www.cnblogs.com/a609251438/p/13137730.html