0

所以我有一个BaseValuation抽象类,它是实现示例FooValuationBarValuation.

我想根据使用输入实例化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 的容器很强大,必须让我以某种方式做到这一点,但我不明白如何做到这一点。有什么想法吗?

4

1 回答 1

5

您可以将类绑定到任何字符串,通常这是在服务提供者中完成的。

$this->app->bind('string', SomethingValuation::class);

然后你可以用App::make('string').

我认为当您将单个实现(具体)绑定到接口(抽象)而不是绑定多个类时,这更有价值。

你也可以只允许 Laravel 通过调用App::make(\Full\Path::class).

两者都允许您将模拟注入具有相同名称的容器中以进行测试。

于 2018-04-25T12:28:22.347 回答