尝试从IOC容器实例化依赖项时未定义的属性异常

cmv*_*mvr 1 php laravel laravel-5

我正在努力加深我在laravel建筑中的知识.

  1. 我有一个搜索引擎(为了示例而进行弹性搜索),但此搜索引擎将来可能会发生变化.所以我试着为此写一个容器,所以万一我以后会改变引擎,我将只需要改变容器.(我相信这个界限是工厂设计的吗?)

  2. 我创建了一个如下所示的提供程序app/providers/DataFromSearchEngine.php:

    use Illuminate\Support\ServiceProvider;
    
    class DataFromSearchEngine extends ServiceProvider {
       public function boot()
       {
        //
       }
    
       public function register()
      {
        $this->app->singleton('SearchEngine', function($app) {
           return new elasticSearch; 
        });
      }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后我在提供者数组中注册了它config/app.php.

    'providers' => [
        // providers...
    
        'App\Providers\DataFromSearchEngine'
    ],
    
    Run Code Online (Sandbox Code Playgroud)
  4. 下一步是SearchEngine从我的控制器打电话:

    namespace App\Http\Controllers;
    
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    use Illuminate\Http\Request;
    
    class SearchController extends Controller {
    
       protected $searchEngine;
    
       public function __construct() {
          $this->searchEngine = $this->app->make('SearchEngine');
       }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

但所有这些产量:未定义的属性: App\Http\Controllers\SearchController::$app

有人能解释我错过了什么吗?

Mat*_*row 6

而不是使用$this->app尝试使用app().

这是因为继承的控制器类,即非App\Http\Controllers\ControllerIlluminate\Routing\Controllers\Controller对他们的应用程序性能.

作为注释,您可以使用app('SearchEngine')相当于app()->make('SearchEngine')制作对象的快捷方式.