2016-09-22 4 views
0

ich mache einen serviceprovider und füge Provider in app.php hinzu aber wie kann ich es benutzen?laravel create service provider

<?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 Klasse ist in App \ Helpers \ api \ gg Ordner, und ich will diese Klasse verwenden überall, wie die

gg::isReady(); 

app.php

'providers' => [ 
     ... 
     App\Providers\ApiServiceProvider::class, 
     ... 

    ] 

Homecontroller @ Index

public function index() 
{ 
    //how can use this provider in there ? 
    return view('pages.home'); 
} 

Antwort

0

Wenn Siegetan habenhaben Sie eine Instanz einer Klasse an die IoC gebunden. Wenn Sie an die IoC binden, stellen Sie diese in der gesamten Anwendung zur Verfügung. JEDOCH:

Ihre Namespaces brechen PSR-1 Compliance. Dies liegt daran, dass Sie nicht StudlyCaps verwenden.

BAD: use App\Helpers\api\gg\gg

GOOD: use App\Helpers\Api\GG\GG.

Benennen Sie Ihre Ordner/Dateien entsprechend um. Wenn das sortiert ist, sollte sich Ihre Bindefunktion tatsächlich zu einem singleton ändern. Dies liegt daran, dass Sie einen dauerhaften Status und kein wiederverwendbares Modell möchten.

$this->app->singleton(GG::class, function(){ 
    return new GG; 
}); 

Sie auch nicht ->isReady() in jeder Funktion überprüfen sollen, das ist ein Beispiel für ein anti-pattern. Stattdessen sollten diese in einer Middleware sein:

php artisan make:middleware VerifyGGReady 

Fügen Sie diese auf Ihrem Kernel:

protected $routeMiddleware = [ 
    //other definitions 

    'gg_ready' => App\Http\Middleware\VerifyGGReady::class 
]; 

Aktualisieren Sie die handle() Funktion in Ihrer Middleware:

public function handle($request, Closure $next) { 
    if ($this->app->GG->isReady()) { 
     return $next($request); 
    } 

    return redirect('/'); //gg is not ready 
}); 

Und dann entweder initialisieren es in Ihre Routengruppen:

Route::group(['middleware' => ['gg_ready']], function(){ 
    //requires GG to be ready 
}); 

oder direkt auf einer Route:

Route::get('acme', '[email protected]')->middleware('gg_ready'); 

Oder es in Ihrem Controller verwenden:

$this->middleware('gg_ready'); 
+0

i versuchen. Vielen Dank – Hanik

Verwandte Themen