ServiceContainer, ServiceProvide

2017-12-08  本文已影响0人  浓眉小眼_2f50
实现

定义一个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】
上一篇 下一篇

猜你喜欢

热点阅读