我试图在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
有人可以解释我错过了什么吗?
答案 0 :(得分:5)
而不是使用$this->app
尝试使用app()
。
这是因为非继承的控制器类,即App\Http\Controllers\Controller
或Illuminate\Routing\Controllers\Controller
都有app属性。
作为备注,您可以使用app('SearchEngine')
相当于app()->make('SearchEngine')
作为制作对象的快捷方式。
答案 1 :(得分:0)
尝试创建服务提供商时遇到此问题。我在AppServiceProvider.php中注册了我的服务提供商,但仍然遇到此错误。问题是在ServiceProvider中,我需要向班级添加extends ServiceProvider
。看起来很简单,但常常被人们遗忘。