Как передать зависимости в Laravel Facades?

У меня есть фасад Laravel с именем Helper, у которого есть инъекция зависимостей конструктора во внешний репозиторий. Но я не могу передать его зависимость через поставщика услуг фасадов.

Вот код для Helper.php

<?php

namespace App\Helpers;

use App\Repositories\PropertyUpload\PropertyUploadRepositoryInterface;

class Helper
{
    /**
     * @var PropertyUploadRepositoryInterface
     */
    protected $propertyUploadRepo;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct(
        PropertyUploadRepositoryInterface $propertyUploadRepository
    )
    {
        $this->propertyUploadRepo = $propertyUploadRepository;
    }

    /**
     * Get property Cover Photo
     * 
     * @param int $property_id
     * @return string $img_url
     */
    public function getPropertyCoverPhoto($property_id) 
    {
        $property_uploads = $this->propertyUploadRepo->findBy(['property_id' => $property_id, 'status' => 1]);


        return $property_uploads;
    }
}

Вот что я делаю в файле FacadesServiceProviders.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Repositories\PropertyUpload\PropertyUploadRepository;

class FacadesServiceProviders extends ServiceProvider
{

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('helper', function(PropertyUploadRepositoryInterface $propertyUploadRepository){
            return new \App\Helpers\Helper($propertyUploadRepository);
        });
    }
}

Но теперь я получаю эту ошибку

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_RECOVERABLE_ERROR)

Type error: Argument 1 passed to App\Providers\FacadesServiceProviders::App\Providers{closure}() must be an instance of App\Providers\PropertyUploadRepositoryInterface, instance of Illuminate\Foundation\Application given,

Если я удалил зависимость конструктора, фасады My Helper будут работать нормально. Так что ошибки в настройке фасада нет.

Мой вопрос: как передать зависимость конструктора вышеупомянутого поставщика услуг Laravel?

Если кто-то уже сталкивался с этой ситуацией, пожалуйста, помогите мне.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
600
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Просто свяжите сам класс и позвольте Laravel обработать экземпляр, он будет использовать отражение для определения зависимостей.

$this->app->bind('helper', \App\Helpers\Helper::class);

Это, конечно, при условии, что вы связали конкретный класс с интерфейсом PropertyUploadRepositoryInterface, чтобы Laravel мог внедрить правильную зависимость.

Кроме того:

Вам не нужна привязка, если вы не хотите ее иметь. Ваш фасад может просто получить доступ к привязке с именем App\Helpers\Helper, и он без проблем разрешит ее (при условии, что App\Helpers\Helper может быть разрешен из контейнера).

protected static function getFacadeAccessor()
{
    return \App\Helpers\Helper::class;
}

Кроме того, вам даже не нужно делать фасад, чтобы использовать фасад. \Facades\App\Helpers\Helper::randomMethods() будет использовать фасад реального времени для этого класса.

Другие вопросы по теме