Laravel框架 之 IoC实战

2018-04-19  本文已影响22人  诺之林

本文的示例代码参考IoC02

目录

开始

composer require "laravel/framework:5.5.*"

Basic

vim basic.php
<?php

require __DIR__.'/vendor/autoload.php';

interface Logger
{
    public function debug($message);
}

class ConsoleLogger implements Logger
{
    public function debug($message)
    {
        echo '[console] debug: '.$message; 
    }
}

$container = new Illuminate\Container\Container();

$container->bind(Logger::class, ConsoleLogger::class);

$instance = $container->make(Logger::class);
$instance->debug('hello container');
php basic.php
[console] debug: hello container

Dependency Injection

vim di.php
<?php

require __DIR__.'/vendor/autoload.php';

interface Logger
{
    public function debug($message);
}

class ConsoleLogger implements Logger
{
    public function debug($message)
    {
        echo '[console] debug: '.$message;            
    }
}

class IndexController
{
    public $logger;
    
    public function __construct(Logger $logger)
    {
        $this->logger = $logger;
    }

    public function get($url)
    {
        $this->logger->debug($url);
    }
}

$container = new Illuminate\Container\Container();

$container->bind(Logger::class, ConsoleLogger::class);
$container->singleton(IndexController::class);

$instance = $container->make(IndexController::class);
$instance->get('/index');
php di.php
[console] debug: /index

When

vim when.php
<?php

require __DIR__.'/vendor/autoload.php';

interface Logger
{
    public function debug($message);
}

class ConsoleLogger implements Logger
{
    public function debug($message)
    {
        echo '[console] debug: '.$message;            
    }
}

class FileLogger implements Logger
{
    public function debug($message)
    {
        echo '[file] debug: '.$message;            
    }
}

class IndexController
{
    public $logger;
    
    public function __construct(Logger $logger)
    {
        $this->logger = $logger;
    }

    public function get($url)
    {
        $this->logger->debug($url);
    }
}

class AnotherController
{
    public $logger;

    public function __construct(Logger $logger)
    {
        $this->logger = $logger;
    }

    public function get($url)
    {
        $this->logger->debug($url);
    }
}

$container = new Illuminate\Container\Container();

$container->when(IndexController::class)
    ->needs(Logger::class)
    ->give(ConsoleLogger::class);
$container->when(AnotherController::class)
    ->needs(Logger::class)
    ->give(function () {
        return new FileLogger();
    });

$container->singleton(IndexController::class);
$container->singleton(IndexController::class);

$instance1 = $container->make(IndexController::class);
$instance1->get('/index');

echo "\n--------------------\n";

$instance2 = $container->make(AnotherController::class);
$instance2->get('/index');
php when.php
[console] debug: /index
--------------------
[file] debug: /index

参考

上一篇 下一篇

猜你喜欢

热点阅读