草庐IT

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

coder 2024-04-22 原文

我在我的 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/

有关php - 服务提供商内部的 Laravel 5 存储库的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  7. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  8. ruby - Rails 开发服务器、PDFKit 和多线程 - 2

    我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:

  9. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  10. ruby - 是否可以从也在该模块中的类内部调用模块函数 - 2

    在这段Ruby代码中:ModuleMClassC当我尝试运行时出现“'M:Module'的未定义方法'helper'”错误c=M::C.new("world")c.work但直接从另一个类调用M::helper("world")工作正常。类不能调用在定义它们的同一模块中定义的模块函数吗?除了将类移出模块外,还有其他解决方法吗? 最佳答案 为了调用M::helper,你需要将它定义为defself.helper;结束为了进行比较,请查看以下修改后的代码段中的helper和helper2moduleMclassC

随机推荐