Laravel-依赖注入深入了解

26次阅读

共计 1857 个字符,预计需要花费 5 分钟才能阅读完成。

最近在学习 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…

正文完
 0