ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 概念 `register`方法用于绑定接口和实现,初始化配置等,在这个函数中不能保证其它服务已经完全加载完毕,因此只能用于注册相关的工作,不能调用其它服务,而`boot`调用的时候,所有的服务都已经注册完毕,可以放心的使用Laravel中注册的对象,可以调用其它服务 首先我们在项目中搜索关键字ServiceProvider,会出现很多服务提供者.我们来看这个代码 主要搜索register这个方法,他里面注册了2个方法 我们看这个方法registerNativeFilesystem,这里面代码就是把Filesystem这个对象绑定到files这个关键字中,这个关键字可以理解一个key,可以用app()这个帮助函数来实现 app()这个帮助函数在入口文件index.php中 `$app = require_once __DIR__.'/../bootstrap/app.php';` 我们看Filesystem这个类中有get这个方法来获取文件内容,我们来用下个这功能 在路由中写 ~~~ Route::get('/pro',function (){ //make里面是之前绑定的关键字,调用get这个方法来获取Kernel.php这个文件内容 dd(app()->make('files')->get(__DIR__.'/Kernel.php')); }); ~~~ `app()->make('files')` 也可以写成app(files)或者 `app()['files']` app这个在helpers.php这个文件中,如果传入参数会实例化对应的类,如果没有传递参数,会返回入口文件中 `$app = require_once __DIR__.'/../bootstrap/app.php` 这个 上面我们可以用app()来实例化,我们也可以自己new,但是自己new不好,如果我们new的同时有参数传递,可以在register绑定的那个方法中new来传递参数 我们再看个例子 ~~~ class bar{} App::bind('Foo',function(){ return new bar(); }); Route::get('/pro',function (){ //make里面是之前绑定的关键字,调用get这个方法来获取Kernel.php这个文件内容 dd(app('Foo')); }); ~~~ ## 向IOC容器中添加自己的类 我们在app这个文件夹下新建一个Biling这个文件夹,里面写Stripe.php,编辑 ~~~ namespace App\Biling; class Stripe { public function charge() { dd('charge'); } } ~~~ 我们想把这个类放到服务容器里面,我们可以创建一个服务容器php artisan make:provider BilingServerProvider 会创建到App\Providers这个文件夹下面,在对应文件里面我们可以看到一个非常熟悉的方法,这个方法和上面讲的register一样 ~~~ public function register() { $this->app->bind('biling',function (){ //写对应的namespace return new Stripe(); }); } ~~~ 这个时候我们有服务提供者了,但是我们还用不了,我们要在服务容器中让他知道他存在 我们再config/app.php中那个数组中添加App\Providers\BilingServerProvider::class,接下来我们就可以使用这个了.在路由中写 ~~~ Route::get('pro',function(){ $biling=app('biling'); dd($biling->charge()); }); ~~~ 当然你也可以写依赖注入 ~~~ Route::get('pro',function(\App\Biling\Stripe $stripe){ dd($stripe->charge()); }); ~~~ 单例 ~~~ $this->app->singleton('HelpSpot\API', function ($app) { return new HelpSpot\API($app->make('HttpClient')); }); ~~~ 绑定接口到实现 服务容器有一个很强大的功能,就是支持绑定接口到给定的实现。例如,如果我们有个`EventPusher`接口 和一个`RedisEventPusher`实现。一旦我们写完了`EventPusher`接口的`RedisEventPusher`实现,我们就可以在服务容器中注册它,像这样: ~~~php $this->app->bind( 'App\Contracts\EventPusher', 'App\Services\RedisEventPusher' ); ~~~ 这么做相当于告诉容器:当一个类需要实现`EventPusher`时,应该注入`RedisEventPusher`。现在我们就可以在构造函数或者任何其他通过服务容器注入依赖项的地方使用类型提示注入`EventPusher`接口