如何在 Laravel Facades 中传递依赖项?
Posted
技术标签:
【中文标题】如何在 Laravel Facades 中传递依赖项?【英文标题】:How to pass dependencies in Laravel Facades? 【发布时间】:2018-12-31 23:44:58 【问题描述】:我有一个名为 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)
类型错误:参数 1 传递给 App\Providers\FacadesServiceProviders::App\Providersclosure() 必须 是 App\Providers\PropertyUploadRepositoryInterface 的一个实例, 给定的 Illuminate\Foundation\Application 实例,
如果我删除了构造函数依赖项,我的助手门面工作正常。所以配置门面没有错误。
我的问题是如何在上面的 Laravel 服务提供者中传递构造函数依赖?
如果有人以前遇到过这种情况,请帮助我。
【问题讨论】:
【参考方案1】:另外:
除非你想拥有它,否则你不需要绑定。您的外观可以只访问名为 App\Helpers\Helper
的绑定,它会毫无问题地解决它(只要 App\Helpers\Helper
可以从容器中解决)。
protected static function getFacadeAccessor()
return \App\Helpers\Helper::class;
除此之外,您甚至不需要制作 Facade 即可使用 Facade。
\Facades\App\Helpers\Helper::randomMethods()
将使用该类的实时外观。
【讨论】:
【参考方案2】:只需绑定类本身,让 Laravel 处理实例化,它会使用反射来确定依赖关系。
$this->app->bind('helper', \App\Helpers\Helper::class);
这当然是假设你已经将一个具体的类绑定到接口 PropertyUploadRepositoryInterface 以便 Laravel 可以注入正确的依赖项。
【讨论】:
以上是关于如何在 Laravel Facades 中传递依赖项?的主要内容,如果未能解决你的问题,请参考以下文章