加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 19:36:25 所属栏目:大数据 来源:网络整理
导读:我的laravel 5项目中存在以下问题.我有一个名为MacroServiceProvider.php的表单宏的服务提供程序.有些宏应该从数据库接收数据,我目前正在使用该模型并以雄辩的方式获得结果,但我想使用存储库,所以我创建了我的存储库,但我不能将它直接注入我的服务提供者. 我
我的laravel 5项目中存在以下问题.我有一个名为MacroServiceProvider.php的表单宏的服务提供程序.有些宏应该从数据库接收数据,我目前正在使用该模型并以雄辩的方式获得结果,但我想使用存储库,所以我创建了我的存储库,但我不能将它直接注入我的服务提供者.

我想要这样的东西:

...
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
}

和一个实现EloquentMyRepo.php

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

正面

使用此定义外观文件MacroFacade.php

use IlluminateSupportFacadesFacade;

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('AppMyRepoInterface','AppEloquentMyRepo');
    // ...
}

因此,当您在依赖注入中使用MyRepoInterface时,Laravel知道它必须使用EloquentMyRepo的实例.

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

namespace AppProviders;

use IlluminateSupportServiceProvider;

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

现在,当我们需要注册为宏的Facade时,使用MacroService的一个实例.

组态

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

...
'providers' => [
    ...
    'AppProvidersAppServiceProvider',...
    'AppProvidersMacroServiceProvider',],

(请注意,MacroServiceProvider是在AppServiceProvider之后声明的.)

添加外观的别名:

'aliases' => [
    ...
    'Macro' => 'AppMacroFacade',

完成!

怎么了

我们假设你打电话

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

在你的代码中.如何调用正确的方法?

> Macro是MacroFacade类处理的别名
>通过MacroFacade的getFacadeAccessor()方法在IoC中使用宏名称注册Facade
> MacroServiceProvider将MacroService类注册为宏的实现
>必须创建MacroService实例,但它具有MyRepoInterface作为依赖项
>当需要MyRepoInterfice时,AppServiceProvider说Laravel使用EloquentMyRepo
>因此创建了一个EloquentMyRepo实例,它用于创建MacroService实例
>宏已解析为MacroService的实例
> Laravel调用该实例的myMacro1()方法

我希望这可以澄清一下会发生什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读