Lumen - 服務容器,服務提供者,Facades的關係

weixin_34236869發表於2018-05-11
  • Contracts 合同,契約,也就是介面,定義一些規則,每個實現此介面的都要實現裡面的方法
ServiceContainer 實現Contracts,具體的邏輯實現

ServiceProvider ServiceContainer的服務提供者,返回ServiceContainer的例項化,供其他地方使用,可以把它加入到app/config的provider中,會被自動註冊到容器中

Facades 簡化ServiceProvider的呼叫方式,而且可以靜態呼叫ServiceContainer中的方法

ServiceContainer :實現Contracts,具體的邏輯實現

ServiceProvider :ServiceContainer的服務提供者,返回ServiceContainer的例項化,供其他地方使用,可以把它加入到app/config的provider中,會被自動註冊到容器中

Facades: 簡化ServiceProvider的呼叫方式,而且可以靜態呼叫ServiceContainer中的方法
  • 操作示例
    首先先在:app\Providers\Dava目錄下建立DavaServiceProvider.php檔案

     <?php
    /**
       * Created by PhpStorm.
       * User: dava
       * Date: 2018/5/11
       * Time: 17:54
     */
    
    namespace App\Providers\Dava;
    
    use App\Http\Controllers\test;
    use Illuminate\Support\ServiceProvider;
    
    class DavaServiceProvider extends ServiceProvider
    {
      /**
       * Bootstrap the application services.(引導應用程式服務。)
       *
       * @return void
       */
      public function boot()
      {
      //
      }
    
      /**
     * Register the application services.(註冊應用程式服務。)
     *
     * @return void
     */
     public function register()
    {
      //
      $this->app->bind('dava',function(){ 
          return new test();    //要操作的物件
      });
    }
    }
    

第二,在dava-project\bootstrap目錄下的app.php 給應用註冊服務,這裡註冊的服務都是服務提供者 提供 位置都在 \App\Providers下

  $app->register(\App\Providers\Dava\DavaServiceProvider::class);

第三,呼叫剛剛註冊的服務,你可以選擇在任意可以掉用方法的地方掉用

    <?php
    /**
     * Created by PhpStorm.
     * User: dava
     * Date: 2018/5/8
     * Time: 15:17
     */
    namespace App\Http\Controllers\Admin\Messages;

    use App\Define\Common;
    use App\Http\Controllers\Controller;
    use App\Logic\Admin\Messages\AdminMessagesLogic;
    use Illuminate\Support\Facades\App;
    use Illuminate\Support\Facades\Dava;

    class GetList extends Controller
    {

      public function run() {
      //沒有引入Facades的呼叫方式,但是這樣不太友好,還有優化
      $myfoo = App::make("dava");
      echo $myfoo->Test();

      //引入Facades的呼叫方式
      echo Dava::Test();die;
}
}

第四,引用Facades模式,找到\vendor\illuminate\support\Facades目錄,
並且再裡面建立Dava.php

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

  class Dava Facade
  {
    protected static function getFacadeAccessor()
      {
    //這裡返回的是ServiceProvider中註冊時,定義的字串
    return 'dava';
}
}

完工

相關文章