Service Provider 可以把相关的 IoC 注册放到到同一个地方,大部份的 Laravel 核心组件都有 Service Provider,所有被注册的服务提供者都列在 app/config/app.php 配置文件的 providers 数组里。如何写一个 Service Provider 手册里面写的也比较简洁,实际项目中如何运用还是有点模糊,这里来简单写一个实例,便于理解和实际项目中扩展使用,也许对 IOC 和依赖注入都有个更深刻的了解。

和《Laravel 创建 Facades 实例》类似,先在 app 目录下新建目录 app/libs/App/Service,所有的 Service 都放在这个 Service 下面,然后在composer.json中添加:

"autoload": {
	......
        "psr-0":{
            "App":"app/libs"
        }
},

App 的命名空间随意定,执行下composer dump

建立一个TestService,新建目录app/libs/App/Service/Test, 简单写一个 ServiceInterface 并实现。

app/libs/App/Service/Test/TestServiceInterface.php代码很简单:

<?php namespace App\Service\Test;

interface TestServiceInterface {}

app/libs/App/Service/Test/TestService.php代码很简单:

<?php namespace App\Service\Test;

class TestService implements TestServiceInterface {
    public function callMe()
    {
        dd('this is the test service');
    }
}

接下来就是定义一个 Service Providor,新建app/libs/App/Service/ServiceServiceProvidor.php, 代码如下:

<?php namespace App\Service;

use Illuminate\Support\ServiceProvider;

class ServiceServiceProvider extends ServiceProvider {

    /**
     * IoC binding of the service.
     *
     * @return void
     */
    public function register()
    {

        $namespace = 'App\Service\\';

        $services = [
            $namespace . 'Test\TestServiceInterface' => $namespace . 'Test\TestService',
        ];

        foreach ($services as $interface => $instance) {
            $this->app->bind($interface, $instance);
        }

    }

}

register 通过 $this->app->bind 使用 IoC 容器。

App\Service\ServiceServiceProvider加到配置文件 app/config/app.php 的 providers 数组。

App\Service\ServiceServiceProvider加到配置文件 app/config/app.php 的 providers 数组。 OK 了,在 HomeController 中来测试一下:

<?php
use App\Service\Test\TestServiceInterface;

class HomeController extends BaseController {

    /*
    |--------------------------------------------------------------------------
    | Default Home Controller
    |--------------------------------------------------------------------------
    |
    | You may wish to use controllers instead of, or in addition to, Closure
    | based routes. That's great! Here is an example controller method to
    | get you started. To route to this controller, just add the route:
    |
    |	Route::get('/', 'HomeController@showWelcome');
    |
    */

    public function __construct(TestServiceInterface $test)
    {
        $this->test = $test;
    }

    public function showWelcome()
    {
        $this->test->callMe();
        return View::make('hello');
    }

}

输出 this is the test service

转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

本文链接地址: Laravel 创建 Service Provider 实例

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可