1、什么是容器
容器是一个用于管理类依赖和执行类依赖注入的工具,简而言之,容器就是我们在应用程序中定义、绑定和解析依赖项,以实现松耦合和可测试性。在laravel中应用本身就是一个容器,容器管理调用各种服务 laravel在运行的时候会创建一个app对象 这个对象就是容器 所有的服务都是在app中调用的。
几乎所有的服务容器绑定都会在服务提供者中注册,在服务提供者中可以通过blind方法去注册一个绑定,也可以通过单例singleton去注册绑定,还有instance等方法注册绑定。
2、依赖注入
在Laravel框架中,开发者可以使用以下方式实现依赖注入:
1.在控制器的构造函数中声明依赖 注入Application实例
public function __construct(Application $app)
{
$this->app = $app;
}
2.在控制器方法中声明依赖 注入Closure实例
public function handle($request, Closure $next, ...$guards)
{
$this->authenticate($request, $guards);
return $next($request);
}
3.使用闭包函数生成对象
use App\Repositories\UserRepository;
use App\Services\UserService;
use Illuminate\Contracts\Container\Container;
class UserController extends Controller
{
protected $container;
public function __construct(Container $container)
{
$this->container = $container;
}
public function getUser($id)
{
$userService = $this->container->make(UserService::class, [
'userRepository' => $this->container->make(UserRepository::class),
]);
$user = $userService->getUser($id);
return view('user', compact('user'));
}
}
上面的代码中,我们在构造函数中注入了一个Container对象,然后通过make方法生成了一个UserService对象,并将UserRepository对象作为参数传递给make方法。
3、IOC(控制反转)
控制反转(Inversion of Control,IoC)是面向对象编程中的一种设计模式,它是一种将控制权转移给另一个对象的方式,以达到降低代码的耦合度的目的。
class A
{
protected $b;
public function __construct(B $b) {
$this->b = $b;
}
public function getB(){
return $this->b->bMethod();
}
}
class B
{
public function __construct() {}
public function bMethod(){
return "Hello World!";
}
}
// IOC容器类
class Ioc
{
protected $instances = [];
public function __construct() {
$this->instances['B'] = new B();
$this->instances['C'] = new C();
$this->instances['D'] = new D();
}
public function make($abstract){
return $this->instances[$abstract];
}
}
// 控制反转:类与类的依赖关系不再在类A中创建,
// 而是通过IOC容器生成类B后通过参数的形式传入类A中;
$ioc = new Ioc();
$b = $ioc->make('B');
$a = new A($b);
$a->getB();
4、反射
反射是程序实现依赖注入的基础,也是Laravel服务容器实现服务解析的基础
反射函数参考:
ReflectionClass 报告了一个类的有关信息
ReflectionClass::getConstructor — 获取类的构造函数
ReflectionClass::getConstructor::getParameters — 获取到Constructor的属性值
ReflectionClass::newInstanceArgs — 从给出的参数创建一个新的类实例。
ReflectionParameter::getClass — 获得类型提示类。
ReflectionParameter::isDefaultValueAvailable — 检查是否有默认值。
ReflectionParameter::getDefaultValue — 获取到默认的属性值
如下几组方法,就是反射。
//获取类的反射信息,也就是类的所有信息
$reflector = new ReflectionClass(类名);
echo $reflector->getDocComment(); 获取类的注释信息
//获取反射类的构造函数信息
$constructor = $reflector->getConstructor();
//获取反射类的构造函数的参数
$dependencies = $constructor->getParameters();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。