@Tereverda

Laravel инъекция зависимостей, как происходит в бизнес логике?

Если в конструкторе или методе указать тайп хинт и название переменной, и use в шапке, автоматом создастся класс.
use Illuminate\Http\Request;
public function __construct(Request $request)
$request->делай_что-то

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

class Controller запускает бизнес класс
new Business($a) - здесь идет передача в конструктор зависимости-класса - все как обычно

Если ничего не передавать new Business() - то выйдет ошибка
class Business - у него есть есть свой конструктор, и дальше по цепочке могут еще быть
public function __construct(BigA $a) - а по идее должно подставится и автоматом все подтянуться.

Я явно не понимаю, какой-то момент, но не могу его нигде найти текстах.
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
AmdY
@AmdY
PHP и прочие вебштучки
У вас какая-то магия описана. На самом деле все эти объекты с учётом зависимостей создаётся через контейнер
https://laravel.com/docs/10.x/container#the-make-method
вместо new Transistor нужно дёргать его из контейнера $this->app->make(Transistor::class);

Но лучше по psr https://laravel.com/docs/10.x/container#psr-11
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Ответ написан
Комментировать
@Tereverda Автор вопроса
Я так понял, если класс, создан вручную через new то никакой контейнер не работает.
Ответ написан
pLavrenov
@pLavrenov
Разработка сайтов
В коде который приведен, Request подключается через import, а сам подход называется dependency injection он описан в документации которую автор не читал.

Пример:
class Test extends Controller
{
    private TestRepository $testRepository;

    public function __construct(TestRepository $testRepository) {
        $this->testRepository = $testRepository;
    }
    
    public function getDataMethod(Request $request)
    {
        dd($request);
        dd($this->testRepository->latest([]));
    }
    
    public function setDataMethod(TestAnyRepository $testAnyRepository)
    {
        dd($testAnyRepository);
    }
}
class TestRepository
{
    public function latest($filter = [])
    {
        return Test::filter($filter, TestFilter::class)->latest('id');
    }

    public function update(Test $model, array $data): bool
    {
        return $model->update(Arr::only($data, Test::getFillableAttributes()));
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы