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

时间:2015-02-25 11:48:42

标签: 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; 
        });
      }
    
    }
    
  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');
       }
    
    }
    
  5. 但所有这些产量:未定义的属性:App\Http\Controllers\SearchController::$app

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

2 个答案:

答案 0 :(得分:5)

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

这是因为非继承的控制器类,即App\Http\Controllers\ControllerIlluminate\Routing\Controllers\Controller都有app属性。

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

答案 1 :(得分:0)

尝试创建服务提供商时遇到此问题。我在AppServiceProvider.php中注册了我的服务提供商,但仍然遇到此错误。问题是在ServiceProvider中,我需要向班级添加extends ServiceProvider。看起来很简单,但常常被人们遗忘。