首页 > 解决方案 > 如何在 Laravel Facades 中传递依赖项?

问题描述

我有一个名为 Helper 的 Laravel Facade,它具有对外部存储库的构造函数依赖注入。但我无法通过门面服务提供商传递它的依赖关系。

这是 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)

类型错误:传递给 App\Providers\FacadesServiceProviders::App\Providers{closure}() 的参数 1 必须是 App\Providers\PropertyUploadRepositoryInterface 的实例,给定的 Illuminate\Foundation\Application 实例,

如果我删除了构造函数依赖项,我的助手门面工作正常。所以配置门面没有错误。

我的问题是如何在上面的 Laravel 服务提供者中传递构造函数依赖项?

如果有人以前有过这种情况的经验,请帮助我。

标签: phplaravel

解决方案


只需绑定类本身并让 Laravel 处理实例化,它将使用反射来确定依赖关系。

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

当然,这假设您已经将一个具体的类绑定到接口 PropertyUploadRepositoryInterface 以便 Laravel 可以注入正确的依赖项。


推荐阅读