Laravel 4 - 何时使用服务提供者?

Posted

技术标签:

【中文标题】Laravel 4 - 何时使用服务提供者?【英文标题】:Laravel 4 - when to use service providers? 【发布时间】:2013-12-24 17:31:21 【问题描述】:

我尝试用谷歌搜索,但没有找到详细信息。

服务提供者是对相关 IoC 注册进行分组的好方法 在一个位置。将它们视为引导组件的一种方式 在您的应用程序中。

从文档中无法理解。这仅在我创建包时需要吗?因此,当我是普通开发人员并且不制作一些要公开发布的软件包时 - 我不需要关心?

【问题讨论】:

你可以在这里看到youtu.be/46ZjuEzE6e0 【参考方案1】:

服务提供者无能为力,您不能只使用 app/start/global.php,但通过服务提供者,您可以将所有逻辑集中在一个地方,并且可以以更加模块化的方式开发应用程序。

如果您要制作软件包,服务提供商几乎是必须的。

【讨论】:

嗯,我用 laravel 工作了 1 个月左右,不记得我把 app/start/global.php 放在了 @SPeed_FANat1c 你把它们放在哪里了? routes.php?如果您不使用 SP,start/global.php 对他们来说将是一个更合乎逻辑的地方 “你把它们放在哪里了”我不太清楚你所说的“它们”是什么意思。你说的是国际奥委会注册吗?我不使用它们。当我想要 IoC 时,我只是输入了构造函数参数: __contruct(Class $classs, Class1 $classs1) 【参考方案2】:

在 Laravel 中,服务提供者与 IoC 容器的工作方式直接相关。它们允许更简单和更模块化的依赖关系方法。事实上,它是一种以引导方式组织代码的好模式(即使在 Laravel 之外)。我认为如果你是普通的开发人员,你仍然需要了解 Laravel 服务提供者的基础知识,因为该模式是 Laravel 架构不可或缺的一部分。我相信它可以让您的工作更轻松。

例如,在安装软件包时,您必须授予应用程序访问该软件包的权限 - 最好的解决方案之一是通过服务提供商列表和外观。另一方面,如果不了解 SP-s 的基础知识,我无法想象成为 Laravel 开发人员。

【讨论】:

【参考方案3】:

构建良好架构的 Laravel 应用程序的关键之一是 学习使用服务提供商作为组织工具。当你在 向 IoC 容器注册许多类,所有这些绑定 可能会开始使您的应用程序/启动文件变得混乱。而不是做容器 在这些文件中注册,创建注册的服务提供者 相关服务。

因此,这是一种将应用程序的服务组织在一个地方以使其更有条理的方法。服务提供者必须至少有一种方法:注册。 register 方法是提供者将类绑定到容器的地方。当请求进入您的应用程序并且框架正在启动时,会在您的配置文件中列出的提供程序上调用 register 方法

'providers' => array(
    'Illuminate\Foundation\Providers\ArtisanServiceProvider',
    'Illuminate\Auth\AuthServiceProvider',
    'Illuminate\Cache\CacheServiceProvider',
    // more ...
    'Illuminate\html\HtmlServiceProvider',
    // more ...
)

这是 app.php 配置文件中的 providers 数组,这是存储在 'Illuminate\Html\HtmlServiceProvider.php' 中的 HtmlServiceProvider

use Illuminate\Support\ServiceProvider;
    class HtmlServiceProvider extends ServiceProvider 

    //...
    public function register()
    
        $this->registerHtmlBuilder();

        $this->registerFormBuilder();
    

    protected function registerHtmlBuilder()
    
        $this->app['html'] = $this->app->share(function($app)
        
            return new HtmlBuilder($app['url']);
        );
    

    protected function registerFormBuilder()
    
        $this->app['form'] = $this->app->share(function($app)
        
            $form = new FormBuilder($app['html'], $app['url'], $app['session']->getToken());
            return $form->setSessionStore($app['session']);
        );
    


Laravel 启动时,它调用这个 (register) 方法,在这个方法中有两行,这行调用两个方法,registerHtmlBuilder()registerFormBuilder(),这两个方法都包含在 @ 987654331@容器使用

$this->app['html'] = $this->app->share(...);
$this->app['form'] = $this->app->share(...);

在这种情况下,两者都是匿名函数,它们返回 html/form 类的实例,这就是为什么,当你使用时

Html::link(...);

或者,使用表单

Form::input(...);

您从可用于您的应用程序的$app 对象中获取绑定类。在这种情况下,'Html' => 'Illuminate\Support\Facades\Html', 用于给 app.php 文件中的 aliases 数组中的主类起别名。

因此,在Laravel 中,服务提供者是一种以更简洁的方式组织事物的方式,在应用程序的启动过程中,Laravel 运行来自所有服务提供者的所有 register 方法,因此每个组件对IoC 容器可用(绑定),以便您可以在应用程序中访问它们。

值得一提的是,在调用服务提供者的所有register 方法后,这些服务提供者的所有boot 方法都会被调用。在这种情况下,如果您需要在服务提供者类中使用应用程序(IoC/服务容器)中的任何服务,那么您应该从引导方法中使用该服务,因为在注册服务提供者期间不能保证任何服务都可用(在 register 方法内)因为服务是通过每个服务提供者的 register 方法注册的,但在 boot 方法内您可以使用任何服务,因为到那时每个服务都希望注册。

也检查这个答案Laravel 4 : How are Facades resolved?,它可能会帮助你理解。

【讨论】:

以上是关于Laravel 4 - 何时使用服务提供者?的主要内容,如果未能解决你的问题,请参考以下文章

laravel 自定义 Facade (门面)

Laravel编写自己的服务提供者

Laravel服务/服务提供者/容器/契约和门面

如何将邮件数据从服务提供商传递到 laravel 4 中的 config/mail.php

无法提供目录 /var/www/html/public/ [Laravel - Aws Elasticbeanstalk]

站点打开后未加载 Laravel 5.4 服务提供商