ServiceContainer, ServiceProvider, Facades关系

  • ServiceContainer 实现Contracts,具体的逻辑实现.
  • ServiceProvider ServiceContainer的服务提供者,返回ServiceContainer的实例化,供其他地方使用,可以把 它加入到app/config的provider中,会被自动注册到容器中.
  • Facades 简化ServiceProvider的调用方式,而且可以静态调用ServiceContainer中的方法.
实现

定义一个ServiceContainer,实现具体的功能

namespace App\Services;

class TestService {
    public function teststh($data){
        return 'dabiaoge'.$data;
    }
}

定义一个ServiceProvider供其他地方使用ServiceContainer

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class TestServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //单例绑定
        $this->app->singleton('Test',function(){
            return new \App\Services\TestService();
        });
      //也可以这样绑定,需要先use App;
        App::singleton('Test',function(){
            return new \App\Services\TestService();
        });
   
    }

在app/config.php中的providers数组中加入ServiceProvider,让系统自动注册.

 App\Providers\TestServiceProvider::class,

这时候就可以使用了

use App;
public function all( Request $request){
    $a='666';
    $test=App::make('Test');//
    echo $test->teststh($a);

这样太麻烦,还需要用make来获取对象,为了简便,就可以使用门面功能,定义门面TestFacade

namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class TestFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        //这里返回的是ServiceProvider中注册时,定义的字符串
        return 'Test';
    }
}

在控制器里就可以直接调用了

use App\Facades\TestFacade;
public function all()
{
    $a='666';
    //从系统容器中获取实例化对象
      $test=App::make('Test');
      echo $test->teststh($a);
    //或者使用门面
    echo TestFacade::test($a);
}    
【转自 https://segmentfault.com/a/1190000004965752】

你可能感兴趣的:(ServiceContainer, ServiceProvider, Facades关系)