Rumah >pembangunan bahagian belakang >tutorial php >Laravel文档的`Service Container`、`Service Providers`两节内容有几个概念搞不太明白

Laravel文档的`Service Container`、`Service Providers`两节内容有几个概念搞不太明白

WBOY
WBOYasal
2016-06-06 20:08:541065semak imbas

Laravel文档的Service ContainerService Providers两节内容有几个概念搞不太明白:
https://laravel.com/docs/5.2/providers
https://laravel.com/docs/5.2/container

1、什么是bootstrapping?
好像靠反射机制来实现,对反射机制的概念也搞不太明白,反射机制是什么反射给什么,反射了个什么东西?

2、boot()方法:
它的作用是什么呢?

3、register()方法:
把什么注册到什么?是把Service注册到Service Container么?那么这两个东西在哪里呢?假如我自己写一个Service,一般放在什么目录?Service Container是一个可以看得见的文件吗,存放在什么目录呢?

4、bind()方法:
把什么绑定到什么?和前面一样,绑定的双方是什么。

麻烦大神帮解释一下。非常感谢!

回复内容:

Laravel文档的Service ContainerService Providers两节内容有几个概念搞不太明白:
https://laravel.com/docs/5.2/providers
https://laravel.com/docs/5.2/container

1、什么是bootstrapping?
好像靠反射机制来实现,对反射机制的概念也搞不太明白,反射机制是什么反射给什么,反射了个什么东西?

2、boot()方法:
它的作用是什么呢?

3、register()方法:
把什么注册到什么?是把Service注册到Service Container么?那么这两个东西在哪里呢?假如我自己写一个Service,一般放在什么目录?Service Container是一个可以看得见的文件吗,存放在什么目录呢?

4、bind()方法:
把什么绑定到什么?和前面一样,绑定的双方是什么。

麻烦大神帮解释一下。非常感谢!

  1. bootstrapping是指Service Provider的注册启动过程。简单说,就是一个Service Provider怎么注册进Service Container,注册事件监听等。

  2. boot方法的作用是当Service Provider注册进Service Container并被Service Container启动后执行的启动代码,做一些初始化的操作。

  3. register()方法就是具体的通过调用Container的bind()方法实现把Service绑定到Service Container的属性上。

  4. bind()方法是在Service Container的方法,Service Provider通过这个方法(以及其他类似方法)来执行绑定。

在Laravel中,一个app就是一个最常见的Service Container,它本质上是一个对象,通过它的bind方法,我们可以为他增加一个属性,这个属性就是Service Provider。但是这个属性的名字等信息怎么来呢,由Service Providerregister决定,register方法里面其实就是确定了provider所绑定在的属性名字。这样一个Service Provider就注册进了container,当我们需要这个provider执行功能的时候,通过属性名字找到provider,然后启动它,一旦启动,provider先运行它的boot方法进行初始化,之后开始实现业务,完成整个过程。

下面结合Laravel的Filesystem的代码分析一下以上过程:

<code><?php //文件位于framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php

namespace Illuminate\Filesystem;
use Illuminate\Support\ServiceProvider;
class FilesystemServiceProvider extends ServiceProvider
{
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->registerNativeFilesystem();
        $this->registerFlysystem();
    }
    /**
     * Register the native filesystem implementation.
     *
     * @return void
     */
    protected function registerNativeFilesystem()
    {
        /*
         * 这里就是具体的注册代码
         * $this->app就是一个ServiceContainer
         * new Filesystem就是实例化一个Service,所以Service就是新生成的FileSystem对象,
         * 也就是在相同目录里的Filesystem.php文件里定义的类的对象
         * files就是要把这个service对象邦定到serviceContainer里的名字
         * singleton是类似bind的方法,只不过邦定的是一个单例
         * 经过邦定之后,就可以通过app->files来使用这个Service
         * 所以本身这个类才叫ServiceProvider,就是只负责提供邦定一个特定service到一个特定的container的功能
        */
        $this->app->singleton('files', function () {
            return new Filesystem;
        });
    }
}</code>

laravel初学者。

关于Service Provider,找到一个解释,这个解释应该没有什么问题。

register方法用于绑定服务到容器,框架会先调用所有provider的register方法,等所有服务都注册完毕再去调用每一个服务的boot方法。
所以不能在register方法里面调用其他provider提供的服务,因为我们无法保证其他服务已经注册完毕。
而在boot方法里面你可以干任何事情!

再说Service Container,看vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php内部实现:

<code>public function register()
{
    $this->registerAuthenticator();

    $this->registerUserResolver();

    $this->registerAccessGate();

    $this->registerRequestRebindHandler();
}

protected function registerUserResolver()
{
    $this->app->bind(
        AuthenticatableContract::class, function ($app) {
            return call_user_func($app['auth']->userResolver());
        }
    );
}
</code>

嗯,现在我想你差不多了解bind方法的作用了吧。

说白了 其实就是通过注册函数 把组件保存到一个大数组中

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn