Write the Code. Change the World.

11月 21

初入

  1. Contracts(契约),也就是接口。定义一些方法,所以实现此接口的类都要实现契约里边的方法。

  2. ServiceContainer (契约的具体实现) ,实现 Contracts。具体实现逻辑写在这里。

  3. ServiceProvider (服务提供者) ,绑定事务到服务容器。

  4. App (服务容器), 在服务提供者中,可以通过 $this->appApp:: 得到。 App::其实就是门面。

  5. Facades(门面), 简化服务提供者的调用方式,用静态的方式调用具体实现里的方法。

具体

通过依赖注入,反射,实现了服务的功能。契约定义好服务所需要的接口,当然也可以不需要这个。当类似抽象功能多的时候,还是实现的好。然后,定义契约的实现。在服务提供者中,将服务绑定到容器。最后,在 config\app.php 中的providers,加入服务提供者。如果想使用门面,创建一个门面,然后在门面中重写getFacadeAccessor。最后,也是要在 config\app.php中的aliases加入门面。

定义契约

<?php

namespace App\Contracts;

interface ViniContract
{
    public function tell($value);
}

建立契约的实现

<?php

namespace App\ServicesContainer;

use App\Contracts\ViniContract;

class ViniService implements ViniContract
{
    public function tell($value)
    {
        echo('viniService->tell->' . $value . '<br/>');
    }
}

建立服务提供者

我们通过 artisan 创建: php artisan make:provider ViniServiceProvider 。在register中,实现绑定。当然,你也可以手动创建。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use App\ServicesContainer\ViniService;

use App;

class ViniServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
        App::bind('vini', function(){
            return new ViniService();
        });
    }
}

修改 config\app.php,在 providers 中加入服务提供者


/*config\app.php*/ 'providers' => [ …, App\Providers\ViniServiceProvider::class, ]

建立控制器

我们通过 artisan 创建: php artisan make:controller ViniController。当然,你也可以手动创建,继承Controller即可。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\ServicesContainer\ViniService;
use App\Facades\ViniFacade;

class ViniController extends Controller
{
    //
    protected $vini;

    public function __construct(ViniService $vini)
    {
        $this->vini = $vini;
    }

    public function index()
    {
        $this->vini->tell('i am vini');

        //ViniFacade::tell('i am facade');
    }
}

添加路由

routes\web.php 中添加一条路由。

Route::get('vini', 'ViniController@index');

一切就绪,在浏览器中访问测试。

如果一切正常,你会发现在浏览器中输出 viniService->tell->i am vini

门面的实现

在以上的基础上,进一步实现门面。

创建门面

门面需要继承 Facade ,并重写 getFacadeAccessor 方法。

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class ViniFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'vini';
    }
}

config\app.phpaliases 中加入门面。


/*config\app.php*/ 'aliases' => [ …, 'Vini' => App\Facades\ViniFacade::class, ]

然后,在上边的controller解开对门面使用的注释。在浏览器中访问。如果一切正常,你会发现浏览器中输出:

viniService->tell->i am vini
viniService->tell->i am facade

最后

门面虽然使用起来很方便,但是不能够直接跳转到对应的方法内部,也不能直观的去了解这个方法的用法。

laravel里的服务容器,服务提供者,契约以及门面的内容还有很多。这个只是简单的开始。

发表评论

电子邮件地址不会被公开。 必填项已用*标注