Laravel 依赖注入深入了解

最近在学习 java 。 看java 入门到精通 。在反射部分 突然对以前不懂的 依赖注入 豁然开朗

依赖注入 就是通过反射 去获取对象中需要的参数 类

下面是模仿laravel 实现过程 。比较 low

原创 转载请注明出处

<?php
 
/**
 *    依赖注入取决的 就是 容器和反射 两个部分
 *    可以考虑一个服务提供者  
 *    然后 在服务提供者进行注册
 *    服务提供者 在生命周期内
 *    进行注册 或者其他的操作 
 *    需要实现接口  
 *    接口 register 为注册 handle  为执行 boot 为监听
 */
namespace app;
use app\interfaces\RequestInterface;
use app\interfaces\SendSmsInterface;
 
/**
 *    实现接口
 */
class Request implements RequestInterface
{
    public $id = 0 ;
}
 
class SendSmsService implements SendSmsInterface 
{
    public $name = "This is sendSmsSevice ";
}
namespace app\interfaces;
 
/**
 *    接口类
 *    解耦使用
 */
interface RequestInterface{}
 
namespace app\interfaces;
 
interface SendSmsInterface {}
 
namespace bpp;
 
/**
 *    容器类
 */
class Container
{
    public $register = [];
 
    public function register(array $bind){
        foreach($bind as $concrete){
            if($concrete  !instanceof Closure){
                throw new Exception();
            }
        }
        $this->register = array_merge($this->register , $bind) ;
    }
}
 
 
 
namespace cpp;
use app\interfaces\RequestInterface;
use app\interfaces\SendSmsInterface;
 
/**
 * 控制器
 */
class UserController
{
    public function __construct()
    {
    }
 
    public function test(RequestInterface $request , SendSmsInterface $sendSmsService){
        var_dump($request->id);
        var_dump("this is 依赖注入");
        var_dump($sendSmsService->name);
    }
}
 
namespace test;
 
use bpp\Container;
 
//实例化容器
$api = new Container();
//将依赖注册到容器
$api->register([
    \app\interfaces\RequestInterface::class => \app\Request::class
]);
$api->register([
    \app\interfaces\SendSmsInterface::class => \app\SendSmsService::class
]);
 
// 模仿路由
$router = "cpp\UserController@test";
$routers = explode("@",$router);
 
// 将 控制器 反射 出来
$ref = (new \ReflectionClass($routers[0]));
 
// 获取 控制器的 方法 里面的参数
$refs = $ref->getMethod($routers[1])->getParameters();
 
$inject = [];
 
foreach ($refs as $re){
    
    //获取参数的类
    $class = $re->getClass()->name;
    // 在容器查询 是否注册过
    if (array_key_exists($class , $api->register)){
        // 获取 容器内注册的方法
        $class = $api->register[$class];
        //浅显易懂
        $classes = $ref->newInstance();
        $name = $routers[1];
        $inject[] = new $class();
    }else {
        throw new \Exception("bug");
    }
}
 
(new $classes())->{$name}(...$inject);

如果对你有帮助 麻烦点击关注我的csdn
https://blog.csdn.net/qq_3496…

    原文作者:Childdreams
    原文地址: https://segmentfault.com/a/1190000020161816
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞