laravel创建服务提供商

时间:2016-09-22 14:11:39

标签: php laravel laravel-5 service-provider

我创建了一个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');
}

1 个答案:

答案 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');