Как создать классы на основе типа в Laravel? - PullRequest
0 голосов
/ 25 апреля 2018

Итак, у меня есть 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(), и я получу желаемую реализацию в соответствии с тем, о чем просил использование.

Но я знаю, что контейнер Ларавелла является мощным и должен позволить мне как-то это сделать, но я не могу понять, как это будет сделано.Любые идеи кто-нибудь?

1 Ответ

0 голосов
/ 25 апреля 2018

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

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

Тогда вы можете создать это с помощью App::make('string').

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

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

И то, и другое позволит вам ввести макет в контейнер с тем же именем для тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...