所以,我有两个不同的类:
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语句是一种很好的做法。
答案 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();
}
);