所以我有一个BaseValuation
抽象类,它的实现示例为FooValuation
和BarValuation
。
我想根据使用输入实例化Foo
或Bar
实现。所以我创建了一个名为Valuation
的简单类,它只是这样做:
<?php
namespace App\Valuation;
class Valuation
{
public $class;
public function __construct($id, $type = 'basic')
{
$class = 'App\Valuation\Models\\' . ucfirst($type) . 'Valuation';
$this->class = new $class($id);
}
public function make()
{
return $this->class;
}
}
使用这个我可以简单地(new App\Valuation\Valuation($id, $type))->make()
,我将根据用途要求获得所需的实现。
但我知道laravel的容器功能强大,必须允许我以某种方式做到这一点,但我无法理解如何做到这一点。任何人的想法?
答案 0 :(得分:3)
您可以将类绑定到任何字符串,通常这是在服务提供者中完成的。
$this->app->bind('string', SomethingValuation::class);
然后您可以使用App::make('string')
实例化此内容。
我认为当您将单个实现(具体)绑定到接口(抽象)而不是绑定多个类时,这会有更多价值。
您也可以通过调用App::make(\Full\Path::class)
让Laravel为您实例化该课程。
两者都允许您将模拟注入具有相同名称的容器中以进行测试。