2017-09-15 72 views
2

這是我的服務提供商:Laravel:爲什麼在實例化其提供的類時未註冊註冊的服務提供者?

<?php 

namespace App\Providers; 

use Illuminate\Support\Facades\Config; 
use Illuminate\Support\ServiceProvider; 

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

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->singleton('\Elastica\Search', function ($app) { 
      $client = new \Elastica\Client(array(
       'host' => env('ES_HOST'), 
       'port' => env('ES_PORT'))); 
      $search = new \Elastica\Search($client); 
      $search->addIndex(Config::get('constants.es_index'))->addType(Config::get('constants.es_type')); 
      return $search; 
     }); 
    } 
} 

當(使用var_dump()/dd()驗證)注入的\Elastica\Search\關閉(第2參數去singleton())不會被調用的情況。提供者已正確註冊 - 按上述進行驗證。爲什麼?

回答

2

在Laravel 5.4及以上版本中,原因是singleton()(和類似的綁定函數)的第一個參數不能有前導斜線。因此,將其更改爲'Elastica\Search'可以解決問題。我花了大約一個小時的調試來實現這一點 - 希望這篇文章節省了一些人這次...

Laravel網站後解釋這個變化:http://laravel-guide.readthedocs.io/en/latest/upgrade/ - 搜索Binding Classes With Leading Slashes

相關問題