Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例

网友投稿 850 2022-05-30

从某种意义上说,服务提供者有点类似HTTP控制器,HTTP控制器用于为相关路由注册提供统一管理,而服务提供者用于为相关服务容器提供统一绑定场所,此外服务提供者还可以做一些初始化启动操作。Laravel的每个核心组件都对应一个服务提供者,可以这么说,服务提供者是Laravel的心脏,是Laravel的核心,核心组件类在这里完成注册、初始化以供后续调用。

既然这么重要,那么如何在自己的Laravel应用中定义和使用服务提供者呢?IT视频资源分享列表IT视频资源分享列表IT视频资源分享列表,分享是一种积极的生活态度!!!https://mp.weixin.qq.com/s/HqeXW1T_Ftx7CI1wvMTPfQ

1、定义服务类

有了上一节有关服务容器的讲述,理解起服务提供者来很简单。我们这里先定义一个绑定到容器的测试类TestService,为了对类的定义加以约束,我们同时还定义一个契约接口TestContract。

定义TestContract如下:

Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例

namespace App\Contracts;

interface TestContract

{

public function callMe($controller);

}

定义TestService如下:

namespace App\Services;

use App\Contracts\TestContract;

class TestService implements TestContract

{

public function callMe($controller)

{

dd('Call Me From TestServiceProvider In '.$controller);

}

}

2、创建服务提供者

接下来我们定义一个服务提供者TestServiceProvider用于注册该类到容器。创建服务提供者可以使用如下Artisan命令:

php artisan make:provider TestServiceProvider

该命令会在app/Providers目录下生成一个TestServiceProvider.php文件,我们编辑该文件内容如下:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use App\Services\TestService;

class TestServiceProvider extends ServiceProvider

{

/**

* Bootstrap the application services.

*

* @return void

*/

public function boot()

{

//

}

/**

* Register the application services.

*

* @return void

* @author LaravelAcademy.org

*/

public function register()

{

//使用singleton绑定单例

$this->app->singleton('test',function(){

return new TestService();

});

//使用bind绑定实例到接口以便依赖注入

$this->app->bind('App\Contracts\TestContract',function(){

return new TestService();

});

}

}

可以看到我们使用了两种绑定方法,更多绑定方法参考服务容器文档。

3、注册服务提供者

定义完服务提供者类后,接下来我们需要将该服务提供者注册到应用中,很简单,只需将该类追加到配置文件config/app.php的providers数组中即可:

'providers' => [

//其他服务提供者

App\Providers\TestServiceProvider::class,

],

4、测试服务提供者

这样我们就可以在应用中使用该服务提供者了,为了测试该服务提供者我们首先使用Artisan命令创建一个资源控制器TestController:

php artisan make:controller TestController

然后在路由配置文件routes.php中定义路由:

Route::resource('test','TestController');

最后去TestController中编写测试代码:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

use App\Http\Controllers\Controller;

use App;

use App\Contracts\TestContract;

class TestController extends Controller

{

//依赖注入

public function __construct(TestContract $test){

$this->test = $test;

}

/**

* Display a listing of the resource.

*

* @return Response

* @author LaravelAcademy.org

*/

public function index()

{

// $test = App::make('test');

// $test->callMe('TestController');

$this->test->callMe('TestController');

}

...//其他控制器动作

}

然后我们去浏览器中访问http://laravel.app:8000/test,分别测试使用App::make和依赖注入解析绑定类调用callMe方法的输出,结果一样,都是:

"Call Me From TestServiceProvider In TestController"

好了,大功告成,是不是很简单?!

此外,Laravel服务提供者还支持延迟加载,具体可参考服务提供者文档。

Laravel

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:为什么S/4HANA的销售订单创建会触发生产订单的创建
下一篇:ElasticSearch进阶篇之-Query DSL
相关文章