尝试从 IOC 容器实例化依赖项时发生未定义 属性 异常
Undefined property exception when trying to instantiate dependency from IOC container
我正在努力加深我在 laravel 架构方面的知识。
我有一个搜索引擎(为了示例的弹性搜索),但是这个搜索引擎将来可能会改变。所以我正在尝试为此编写一个容器,以防万一我将来更改引擎,我将只需要更改容器。 (我相信术语是工厂设计?)
我创建了一个提供程序 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;
});
}
}
然后我在 config/app.php
的 providers 数组中注册了它。
'providers' => [
// providers...
'App\Providers\DataFromSearchEngine'
],
下一步是从我的控制器调用 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
或 Illuminate\Routing\Controllers\Controller
上有一个应用程序 属性。
请注意,您可以使用 app('SearchEngine')
,相当于 app()->make('SearchEngine')
作为制作对象的快捷方式。
我在尝试创建服务提供商时遇到了这个问题。我在 AppServiceProvider.php 中注册了我的服务提供商,但仍然遇到同样的错误。问题是在我的 ServiceProvider 中,我需要将 extends ServiceProvider
添加到我的 class。看似简单却常被遗忘
我正在努力加深我在 laravel 架构方面的知识。
我有一个搜索引擎(为了示例的弹性搜索),但是这个搜索引擎将来可能会改变。所以我正在尝试为此编写一个容器,以防万一我将来更改引擎,我将只需要更改容器。 (我相信术语是工厂设计?)
我创建了一个提供程序
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; }); } }
然后我在
config/app.php
的 providers 数组中注册了它。'providers' => [ // providers... 'App\Providers\DataFromSearchEngine' ],
下一步是从我的控制器调用
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
或 Illuminate\Routing\Controllers\Controller
上有一个应用程序 属性。
请注意,您可以使用 app('SearchEngine')
,相当于 app()->make('SearchEngine')
作为制作对象的快捷方式。
我在尝试创建服务提供商时遇到了这个问题。我在 AppServiceProvider.php 中注册了我的服务提供商,但仍然遇到同样的错误。问题是在我的 ServiceProvider 中,我需要将 extends ServiceProvider
添加到我的 class。看似简单却常被遗忘