TP6手册理解之架构·容器和依赖注入

一、TP已封装好,可直接使用的场景(包括但不限于)

  • 控制器架构方法;
  • 控制器操作方法;
  • 路由的闭包定义;
  • 事件类的执行方法;
  • 中间件的执行方法;

案例

<?php
namespace app\controller;

use think\Request;

class Index
{
    
    
    protected $request;

    public function __construct(Request $request)
    {
    
    
        $this->request = $request;
    }

    public function hello($name)
    {
    
    
        return 'Hello,' . $name . '!This is '. $this->request->action();
    }
}

二、自定义类

对于自定义的类以及方法,如果需要使用依赖注入,需要使用系统提供的invoke助手函数调用

案例1(invoke)

// app\index\controller下的Test控制器
<?php
namespace app\index\controller;

class Test
{
    
    
    public function index(){
    
    
        $A = invoke('app\index\myextend\A001'); // 使用TP的助手函数invoke调用参数为类名非同级文件需要带上命名空间
        $result = $A->outB001test();
        return $result;
    }
}
?>
// app\index\myextend下的A001自定义类(使用依赖注入)
<?php
namespace app\index\myextend;

use think\Request;
use app\index\myextend\B001;

class A001
{
    
    
    protected $request;
    protected $b001;
    // 参数模式为 (类名 变量名, 如果没有use则使用带命名空间的完整类名 变量名) => (Request $request, app\index\myextend\B001 $b001)
    public function __construct(Request $request, B001 $b001)
    {
    
    
        $this->request = $request;
        $this->b001 = $b001;
    }

    public function outB001test(){
    
    
        return $this->b001->test(); // 调用B001类里的test函数
    }
}
?>

// app\index\myextend下的A001自定义类(被注入到A001的类)
<?php
namespace app\index\myextend;
class B001
{
    
    
    public function __construct()
    {
    
    
        echo PHP_EOL.'This is "app/index/myextend/B001 __construct"<br />'.PHP_EOL;
    }

    public function test(){
    
    
        return 'B001->test()';
    }
}
?>

slongzhang-TP自定义类invoke依赖注入案例

slongzhang-TP自定义类invoke依赖注入案例

案例2(app和bind用法|绑定)

使用app助手函数进行容器中的类解析调用,对于已经绑定的类标识,会自动快速实例化;使用app助手函数获取容器中的对象实例(支持依赖注入)

// app\index\controller下的Test控制器
<?php
namespace app\index\controller;

class Test
{
    
    
    public function index(){
    
    
		bind('A001', 'app\index\myextend\A001');
        $result = app('A001')->outB001test();
        return $result;
    }
}
?>

slongzhang-TP自定义类绑定bind使用app()实例化完成依赖注入案例

参考资料

TP6手册-容器与依赖注入

猜你喜欢

转载自blog.csdn.net/qq_35606400/article/details/119857044