我创建了一个serviceprovider并在app.php中添加了提供程序,但我该如何使用它呢?
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Helpers\api\gg\gg;
class ApiServiceProvider extends ServiceProvider
{
protected $defer = true;
public function boot()
{
}
public function register()
{
$this->app->bind(gg::class, function ()
{
return new gg;
});
}
public function provides()
{
return [gg::class];
}
}
gg类位于App \ Helpers \ api \ gg文件夹中,我想在任何地方使用此类
gg::isReady();
app.php
'providers' => [
...
App\Providers\ApiServiceProvider::class,
...
]
的HomeController @索引
public function index()
{
//how can use this provider in there ?
return view('pages.home');
}
答案 0 :(得分:0)
当您执行$this->app->bind()
时,您已将类的实例绑定到IoC
。当您绑定到IoC
时,您可以在整个应用程序中使用它。但是:
您的命名空间符合PSR-1
条件。这是因为您没有使用StudlyCaps
。
BAD :use App\Helpers\api\gg\gg
好:use App\Helpers\Api\GG\GG
。
相应地重命名您的文件夹/文件。通过排序,您的绑定函数实际上应该更改为singleton
。这是因为你想要一个持久状态,而不是一个可重用的模型。
$this->app->singleton(GG::class, function(){
return new GG;
});
您也不应该检查每个功能中的->isReady()
,这是anti-pattern
的一个示例。相反,这应该是一个中间件:
php artisan make:middleware VerifyGGReady
将此添加到您的内核:
protected $routeMiddleware = [
//other definitions
'gg_ready' => App\Http\Middleware\VerifyGGReady::class
];
更新中间件中的handle()
功能:
public function handle($request, Closure $next) {
if ($this->app->GG->isReady()) {
return $next($request);
}
return redirect('/'); //gg is not ready
});
然后在路线组中初始化它:
Route::group(['middleware' => ['gg_ready']], function(){
//requires GG to be ready
});
或直接在路线上:
Route::get('acme', 'AcmeController@factory')->middleware('gg_ready');
或者在你的控制器中使用它:
$this->middleware('gg_ready');