这是使用服务容器的依赖注入的正确方法吗?

时间:2017-11-21 16:22:52

标签: php laravel dependency-injection

所以,我有两个不同的类:

A类

class A implements SomeContract
{
    public function extraThicc()
    {
        return 'Filthy Frank';
    } 
}

B类

class B implements SomeContract
{
    public function extraThicc()
    {
        return 'iDubbbz';
    } 
}

接口

interface SomeContract
{
    public function extraThicc();
}

Boss Class

class Boss
{
    public $someVar

    public function __construct(SomeContract $someVar)
    {
        $this->someVar = $someVar;
    }
}

服务提供商

    $this->app->bind('Boss::class', function($app,$param){
        if ($param['type'] == 'A') return new A();
        if ($param['type'] == 'B') return new B();
    });

解决

public function boss($type)
{
    return app()->makeWith('Boss::class', ['type'=>$type')]);
}

门面

class CoolFacade extends Facade
{
    protected static function getFacadeAccessor() { return 'cool'; }
}

控制器

class StarWarsBattlefrontController extends Controller
{
    public function index()
    {
        return 'Star Wars: Battlefront 2 Loot Boxes are bad, says:'.Cool::Boss('A')->extraThicc();
    }
}

有没有更好的方法将dependdencys注入到类中?因为我认为在服务提供商的绑定方法中使用if语句是一种很好的做法。

1 个答案:

答案 0 :(得分:0)

嗯,你的方法不是依赖注入,而是Facades。如果您阅读Laravel Docs on Facades,您可以看到他们只是将它们描述为易于访问,但不应滥用它们。相反,必须注入依赖关系。

根据您的需要,您可能希望阅读Contextual Binding,这类似于

txHandler.createAndAccept(
    tx -> {
       // Collect to a list before performing actions
        List<Language> toDelete = languages.stream()
            .filter(Language.LANGUAGE_ID.notEqual((short) 1))
            .collect(toList());

        // Do the actual actions
        toDelete.forEach(languages.remover());

        tx.commit();
    }
);