uonick
@uonick
Сгибатель бананов

Как через ioc повесить интерфейсы на Laravel диски?

Привет!

У Laravel есть диски. Это круто и удобно. Но вызывать конфиги в коде, это не удобно и не красиво.

Есть идея заставить ioc работать по такому принципу: я закидываю в конструктор например TemporaryDisk (интерфейс или класс, не важно) а мне придет уже нужный, настроенный диск.

Но при прокидывании конструктор ругается, что прилетел адаптер .

Service::__construct() must implement interface App\Disks\TemporaryDisk, instance of Illuminate\Filesystem\FilesystemAdapter given


Биндил как обычно:
$this->app->bind(TemporaryDisk::class, static fn() => Storage::disk(
    (string) config('disks.tmp')
));


В доке написано, как подменить Filesystem, и оно работает.

Как правильно прокинуть?
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer
Херовая идея. Ты резолвишь TemporaryDisk (свой интерфейс), а в результате получаешь Filesystem? Это же бред. Вот тебе и эксепшен, абсолютно логично что он прилетел.

Более адекватное решение - создай фабрику и резолви диски там, иньекти соответственно фабрику.

Если очень хочешь использовать этот костыль - экстенди TemporaryDisk от FilesystemAdapter.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы