Как создать классы на основе типа в Laravel?

Итак, у меня есть 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

Решение

Вы можете привязать класс к любой строке, обычно это делается в сервис-провайдере.

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

Тогда вы можете создать экземпляр этого с App::make('string'),

Я думаю, что это имеет большую ценность, когда вы привязываете одну реализацию (конкретную) к интерфейсу (абстрактному), а не привязываете несколько классов.

Вы также можете просто позволить Laravel создать экземпляр класса для вас, вызвав App::make(\Full\Path::class),

Оба позволят вам ввести макет в контейнер с тем же именем для тестирования.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]