Php Laravel 5存储库内部服务提供商

Php Laravel 5存储库内部服务提供商,php,laravel-5,Php,Laravel 5,我在我的laravel 5项目中有以下问题。我有一个名为MacroServiceProvider.php的表单宏服务提供程序。一些宏应该从数据库接收数据,我目前正在使用该模型并通过Elount获得结果,但我想使用存储库,因此我创建了存储库,但无法将其直接注入到我的服务提供商 我想要这样的东西: ... public function register(MyRepoInterface $repo) { $registers = $repo->findAll();

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

我想要这样的东西:

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


谢谢。

我认为你不能满足你的要求,而且我认为你误解了供应商的工作方式和目的

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

对于您所说的代码,我设想如下:

...
public function register(MyRepoInterface $repo)
    {
        $registers = $repo->findAll();
        Form::macro...
    }
...
  • 一个存储库接口(
    MyRepoInterface
    ),具有使用
    Eloquent
    (比如
    EloquentMyRepo
    )的实际实现
  • 一个门面,比如说
    Macro
    ,这样你就可以做
    Macro::myMacro1()
    Macro::myMacro2()
    ,等等
  • 方法
    myMacro1()
    myMacro2()
    等使用存储库从数据库获取一些数据,然后从
    表单调用一些方法
如果我是对的,那么我建议这样做

存储库 在文件
MyRepoInterface.php
中使用

interface MyRepoInterface 
{
    public function findAll();

    // ... your other repo methods
}
class EloquentMyRepo implements MyRepoInterface
{
    public function findAll()
    {
        // ... do what you need
    }
}
以及一个带有

interface MyRepoInterface 
{
    public function findAll();

    // ... your other repo methods
}
class EloquentMyRepo implements MyRepoInterface
{
    public function findAll()
    {
        // ... do what you need
    }
}
外观 使用以下命令定义一个facade文件
MacroFacade.php

use Illuminate\Support\Facades\Facade;

class MacroFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'macro';
    }
}
服务等级 在文件
MacroService.php
中定义宏服务类,您可以在其中使用依赖项注入并访问存储库。在这个类中,您定义了
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
    }
}
绑定 在
Providers/AppServiceProvider.php
文件中,转到
register()
方法并添加

public function register()
{
    // ...
    $this->app->bind('App\MyRepoInterface', 'App\EloquentMyRepo');
    // ...
}
因此,当您在依赖项注入中使用
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
的facade时,将使用
MacroService
的实例

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

...
'providers' => [
    ...
    'App\Providers\AppServiceProvider',
    ...
    'App\Providers\MacroServiceProvider',
],
(请注意,
MacroServiceProvider
AppServiceProvider
之后声明)

添加立面的别名:

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

发生了什么 假设你打电话来

...
Macro::myMacro1();
...
在你的代码中。如何调用正确的方法

  • Macro
    是由
    MacroFacade
    类处理的别名
  • 通过
    macrofacadeaccessor()的
    getFacadeAccessor()方法在IoC中使用
    macro
    名称注册facade
  • MacroServiceProvider
    MacroService
    类注册为
    macro
  • 必须创建
    MacroService
    的实例,但它将
    MyRepoInterface
    作为依赖项
  • AppServiceProvider
    表示,如果需要
    MyRepoInterfice
    ,Laravel将使用
    EloquentMyRepo
  • 因此,创建了一个
    EloquentMyRepo
    的实例,它用于创建
    MacroService
  • Macro
    已解析为
    MacroService
  • Laravel调用该实例的
    myMacro1()
    方法

  • 我希望这能澄清一下发生了什么。

    我会尝试做你提到的事情。我没有在服务提供者中定义宏,我有一个扩展了light\Html\FormBuilder的文件,因此我可以将我的宏调用为Form::macro,而不是使用Facade。在我的服务提供商中,我调用:$this->app->bindShared('form',…$form=新宏(…)。我不确定我是否理解:您想使用
    form::macro()
    并访问您的
    macro()
    方法扩展了
    FormBuilder
    类?它成功了!我按照你说的做了,现在它成功了。唯一不同的是,我使用了一个HtmlServiceProvider,而不是默认的服务提供商,还使用了一个宏类来扩展FormBuilder类来构建我的宏,但我所有的查询都是我自己做的正面,谢谢。