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

Undefined property exception when trying to instantiate dependency from IOC container

我正在努力加深我在 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; 
        });
      }
    
    }
    
  3. 然后我在 config/app.php 的 providers 数组中注册了它。

    'providers' => [
        // providers...
    
        'App\Providers\DataFromSearchEngine'
    ],
    
  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');
       }
    
    }
    

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

谁能解释一下我错过了什么?

不要使用 $this->app,请尝试使用 app()

这是因为没有继承的控制器 类,即 App\Http\Controllers\ControllerIlluminate\Routing\Controllers\Controller 上有一个应用程序 属性。

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

我在尝试创建服务提供商时遇到了这个问题。我在 AppServiceProvider.php 中注册了我的服务提供商,但仍然遇到同样的错误。问题是在我的 ServiceProvider 中,我需要将 extends ServiceProvider 添加到我的 class。看似简单却常被遗忘