zoukankan      html  css  js  c++  java
  • DI依赖注入/IOC控制反转

     

    DI依赖注入#

    啥都不说,直接上代码

    <?php
        class UserController 
        {
            private $user;
    
            function __construct(UserModel $user) {
                $this->user = $user;
            }
        }
    
        $user = new UserController(new UserMonel());
    ?>

    User控制器依赖UserModel,实例化的时候,直接注入。

    IOC控制反转#

    先说IOC和DI的区别吧!

    • IOC是一种设计思想
    • DI是一种设计模式

    所以两者有本质上的区别。DI是IOC的一种实现方法(还有ServiceLocator等其他设计模式)。 所谓的反转,主要指由 主动依赖被动依赖

        //主动依赖
        function __construct() {
                $this->user = new UserModel();
        }
    
        //被动依赖
        function __construct(UserModel $user) {
                $this->user = $user;
        }

    参考 浅谈IOC--说清楚IOC是什么

    二.什么是IOC容器.#

    IOC容器 是Laravel的核心设计模式,对于laravel的应用和理解是非常有必要深入学习的!

    IOC思想实现了高度解耦,那么,问题来了,如何管理这些分散的模块呢?这就是容器的任务了!

    可以想象成,在IOC容器中,装着(注册)很多模块。当用户需要一个模块的时候,可以从中拿出来。当提取的模块依赖另一个模块的时候,容器会自动注入,再返回给用户(反射机制实现)。

    是不是碉堡了?大批互相依赖的模块被完美解耦并统一管理了!

    三.什么是服务提供者(ServiceProvider).#

    假设模块一多,那么容器不是越来越大?每次加载,岂不是加载好久? 能不能弄一条管子,连接着模块,插在容器上,需要再通过管道获取呢?这样子,容器只是装着管头而已,就不怕被撑大了!

    这条管子就是 服务提供者

    file

    服务提供者本身也是一个类,不过这个类只有启动和注册两个函数。

        /**
         * Bootstrap the application services.
         *
         * @return void
         */
        public function boot()
        {
           //
        }
    
        /**
         * Register the application services.
         *
         * @return void
         */
        public function register()
        {
            //绑定到容器
            $this->app->singleton(
                'RiakContractsConnection', 
                function ($app) {
                    return new Connection($app['config']['riak']);
                }
            );
        }

    服务提供者在config/app.php中配置,laravel自动注册到容器中。

        'providers' => [
    
            /*
             * Laravel Framework Service Providers...
             */
            IlluminateAuthAuthServiceProvider::class,
            IlluminateBroadcastingBroadcastServiceProvider::class,
            ...
    
            /*
             * Application Service Providers...
             */
            appProvidersAppServiceProvider::class,
            appProvidersAuthServiceProvider::class,
            ...
        ]

    四.什么是门面(Facade).#

    程序猿总是偷懒的,每次要模块,都要去容器里面拿,多麻烦啊!找个人代拿行不?这送货小哥就叫Facade门面。文档中叫静态代理。

    送货小哥都是在config/app.php 中注册的。

        'aliases' => [
            'App'       => IlluminateSupportFacadesApp::class,
            'Config'    => IlluminateSupportFacadesConfig::class,
            'Cookie'    => IlluminateSupportFacadesCookie::class,
            'Crypt'     => IlluminateSupportFacadesCrypt::class,
            'DB'        => IlluminateSupportFacadesDB::class,
            'Route'     => IlluminateSupportFacadesRoute::class,
            ...
        ],

    查看IlluminateSupportFacadesRoute代码,可以发现只有getAccessFacade()方法,这就是交代送啥货的函数,继承了Facade这个小哥基类。

        class Route extends Facade
        {
            /**
             * Get the registered name of the component.
             *
             * @return string
             */
            protected static function getFacadeAccessor()
            {
                return 'router';
            }
        }

    注册了Facade门面后,就可以在任意地方使用了!

    文档有详细的使用方式 Laravel 架构 — Facades

    五.Application和Kernel#

    不难发现,在引导程序开始初始化的时候,也就是在boostrapapp.php文件,里面一来就new了一个 IlluminateFoundationApplication。下面分别注册了 HttpKernel、ConsoleKernel、ExceptionsHandler等。

    这里可以这么理解,new一个Application,可以看作是创造了一个空间,这个空间初始化的时候,就会为自己注入一个容器,也就是在空间中放了一个容器。

    IlluminateFoundationApplication.php 中的 registerBaseBindings() 函数可以查看到容器注入源码。

    至于kernel,可以看成是这个空间的工人,有各种各样的工人,每个工人都有自己的工作。好比HttpKernel,负责处理http请求以及控制整个请求流程。

  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/agang-php/p/6233260.html
Copyright © 2011-2022 走看看