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

标签 laravel laravel-4 service-provider

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

Service providers are a great way to group related IoC registrations in a single location. Think of them as a way to bootstrap components in your application.

不理解文档。仅当我创建包时才需要这个吗?因此,当我是常规开发人员并且不制作一些要公开发布的包时 - 我不需要关心?

最佳答案

One of the keys to building a well architected Laravel application is learning to use serviceproviders as an organizational tool. When you are registering many classes with the IoC container, all of those bindings can start to clutter your app/start files. Instead of doing container registrations in those files, create serviceproviders that register related services.

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

'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(),这两种方法使用 IoC 容器组件

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

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

Html::link(...);

或者,使用表单

Form::input(...);

您可以从应用程序可用的 $app 对象中获取绑定(bind)类。在本例中,'Html' => 'Illuminate\Support\Facades\Html', 用于为 app 中的 aliases 数组中的主类指定别名。 php 文件。

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

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

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

关于Laravel 4 - 何时使用服务提供者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20439583/

相关文章:

java - 如何解密从 Shibboleth IdP 收到的 SAMLResponse

php - 拉维尔 5 : View Composer and Service Provider not working

php - 在 laravel blade 中创建类似简码的 Wordpress

laravel - Composer | laravel 5-更新依赖关系,但框架本身

php - 函数 mcrypt_get_iv_size() 在 Laravel 4 上已弃用

xml - SAML SP 元数据 XML SSO、收件人和目标 URL

php - 用于连接的查询生成器新索引

php - Laravel 有很多子查询

mysql - 从 SQL View 创建 Laravel 模型

php - 调用未定义的方法 Illuminate\\Database\\Schema\\Blueprint::increments()