Итак, у меня есть 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 является мощным и должен позволить мне как-то это сделать, но я не могу понять, как это будет сделано. Любые идеи кто-нибудь?
Вы можете привязать класс к любой строке, обычно это делается в сервис-провайдере.
$this->app->bind('string', SomethingValuation::class);
Тогда вы можете создать экземпляр этого с App::make('string')
,
Я думаю, что это имеет большую ценность, когда вы привязываете одну реализацию (конкретную) к интерфейсу (абстрактному), а не привязываете несколько классов.
Вы также можете просто позволить Laravel создать экземпляр класса для вас, вызвав App::make(\Full\Path::class)
,
Оба позволят вам ввести макет в контейнер с тем же именем для тестирования.
Других решений пока нет …