gpt4 book ai didi

php - 服务提供商内部的 Laravel 5 存储库

转载 作者:可可西里 更新时间:2023-10-31 23:52:55 25 4
gpt4 key购买 nike

我在我的 laravel 5 项目中遇到了以下问题。我有一个名为 MacroServiceProvider.php 的表单宏服务提供商。一些宏应该从数据库接收数据,我目前正在使用该模型并通过 Eloquent 获得结果,但我想改用存储库,所以我创建了我的存储库,但我不能将其直接注入(inject)我的服务提供商。

我想要这样的东西:

...
public function register(MyRepoInterface $repo)
{
$registers = $repo->findAll();
Form::macro...
}
...

我该怎么做?

谢谢。

最佳答案

我认为您无法按照您的要求进行操作,而且我认为您误解了提供程序的工作方式以及它们的用途。

在提供者中,你通常会说接口(interface)和实现之间的绑定(bind)是什么,这样当你在你的应用程序代码中进行依赖注入(inject)时,它就起作用了。我很确定它们不是为了做真正的事情。

对于您所说的代码,我想是这样的:

  • 一个存储库接口(interface)(MyRepoInterface),使用Eloquent(比如EloquentMyRepo)实现
  • 一个门面,比如 Macro,这样你就可以执行 Macro::myMacro1()Macro::myMacro2() 等.
  • myMacro1()myMacro2() 等方法使用存储库从数据库中获取一些数据,然后调用 Form 中的一些方法 门面

如果我是对的,那么我建议这样。

存储库

在文件 MyRepoInterface.php 中定义接口(interface)

interface MyRepoInterface 
{
public function findAll();

// ... your other repo methods
}

EloquentMyRepo.php 的实现

class EloquentMyRepo implements MyRepoInterface
{
public function findAll()
{
// ... do what you need
}
}

外观

用这个定义一个外观文件 MacroFacade.php

use Illuminate\Support\Facades\Facade;

class MacroFacade extends Facade
{
protected static function getFacadeAccessor()
{
return 'macro';
}
}

服务等级

在文件 MacroService.php 中定义您的宏服务类,您可以在其中使用依赖注入(inject)并访问您的存储库。在此类中,您定义了 myMacro1()... 方法。

class MacroService
{
protected $myRepo;

public function __construct(MyRepoInterface $myRepo)
{
$this->myRepo = $myRepo;
}

public function myMacro1()
{
// access the repo
$items = $this->myRepo->findAll();
// ... do something with $items and finally return a string
return Form::macro(...);
}

public function myMacro2($arg1, $arg2)
{
// ... use the parameters to do something else
}
}

绑定(bind)

在您的Providers/AppServiceProvider.php 文件中,转到register() 方法并添加

public function register()
{
// ...
$this->app->bind('App\MyRepoInterface', 'App\EloquentMyRepo');
// ...
}

所以当你在依赖注入(inject)中使用 MyRepoInterface 时,Laravel 知道它必须使用 EloquentMyRepo 的实例。

现在,让我们为您的宏服务创建一个服务提供者。创建一个文件 Providers/MacroServiceProvider.php 并放入其中

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class MacroServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('macro', 'App\MacroService');
}
}

现在,当我们需要注册为 macro 的外观时,将使用 MacroService 的实例。

配置

我们最终需要对配置进行一些更改。打开config/app.php文件,添加新的provider

...
'providers' => [
...
'App\Providers\AppServiceProvider',
...
'App\Providers\MacroServiceProvider',
],

(注意 MacroServiceProvider 是在 AppServiceProvider 之后声明的。)

为门面添加别名:

'aliases' => [
...
'Macro' => 'App\MacroFacade',
],

完成!

发生了什么

假设你打电话

...
Macro::myMacro1();
...

在您的代码中。如何调用正确的方法?

  1. MacroMacroFacade 类处理的别名
  2. Facade 通过 MacroFacadegetFacadeAccessor() 方法以 macro 名称在 IoC 中注册
  3. MacroServiceProviderMacroService 类注册为 macro 的实现
  4. 必须创建 MacroService 实例,但它有 MyRepoInterface 作为依赖
  5. AppServiceProvider 表示 Laravel 在需要 MyRepoInterfice 时使用 EloquentMyRepo
  6. 因此创建了一个 EloquentMyRepo 实例,它用于创建 MacroService 实例
  7. Macro 已解析为 MacroService
  8. 的实例
  9. Laravel 调用该实例的 myMacro1() 方法

我希望这可以澄清发生了什么。

关于php - 服务提供商内部的 Laravel 5 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31453570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com