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

Php 尝试从IOC容器实例化依赖项时出现未定义的属性异常,php,laravel,laravel-5,Php,Laravel,Laravel 5,我想加深我对拉威尔建筑的了解 我有一个搜索引擎弹性搜索的例子,但这个搜索引擎可能会改变在未来。因此,我正在尝试为此编写一个容器,因此,如果我将来要更改引擎,我将只需更改容器。我相信术语是工厂设计 我创建了一个provider app/providers/datafromsearchine.php,如下所示: use Illuminate\Support\ServiceProvider; class DataFromSearchEngine extends ServiceProvider {

我想加深我对拉威尔建筑的了解

我有一个搜索引擎弹性搜索的例子,但这个搜索引擎可能会改变在未来。因此,我正在尝试为此编写一个容器,因此,如果我将来要更改引擎,我将只需更改容器。我相信术语是工厂设计

我创建了一个provider app/providers/datafromsearchine.php,如下所示:

use Illuminate\Support\ServiceProvider;

class DataFromSearchEngine extends ServiceProvider {
   public function boot()
   {
    //
   }

   public function register()
  {
    $this->app->singleton('SearchEngine', function($app) {
       return new elasticSearch; 
    });
  }

}
然后我在config/app.php的providers数组中注册了它

下一步是从我的控制器调用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\controller或light\Routing\Controllers\controller,在它们上有一个App属性

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

请尝试使用app,而不是使用$this->app

这是因为非继承的控制器类,即App\Http\Controllers\controller或light\Routing\Controllers\controller,在它们上有一个App属性


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

我在尝试创建服务提供商时遇到了这个问题。我在AppServiceProvider.php中注册了我的服务提供商,但仍然收到相同的错误。问题是,在我的ServiceProvider中,我需要将extends ServiceProvider添加到我的类中。看起来很简单,但经常被忘记。

我在尝试创建服务提供商时遇到了这个问题。我在AppServiceProvider.php中注册了我的服务提供商,但仍然收到相同的错误。问题是,在我的ServiceProvider中,我需要将extends ServiceProvider添加到我的类中。看起来很简单,但经常被忘记。

不要使用$this->app,尝试将app作为非继承控制器类使用,其中有一个app属性。您可以将其作为答案发布,以便我可以接受它吗?不要使用$this->app,尝试将app作为非继承控制器类使用,其中有一个app属性。您可以将其作为答案发布,以便我可以接受它吗可以接受吗?请注意,您可以使用app->make'Foo'或app'Foo'作为快捷方式:请注意,您可以使用app->make'Foo'或app'Foo'作为快捷方式:
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');
   }

}