美文网首页
Laravel框架 之 IoC实战

Laravel框架 之 IoC实战

作者: 诺之林 | 来源:发表于2018-04-19 16:22 被阅读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

参考

相关文章

网友评论

      本文标题:Laravel框架 之 IoC实战

      本文链接:https://www.haomeiwen.com/subject/anaikftx.html