2016-09-22 5 views
0

저는 serviceprovider를 만들고 app.php에 공급자를 추가하지만 어떻게 사용할 수 있습니까?laravel 서비스 공급자 만들기

<?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 클래스는 응용 프로그램 \ 도우미 \ 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

$this->app->bind()을 사용하면 클래스 인스턴스를 IoC에 바인딩했습니다. IoC에 바인딩하면 응용 프로그램 전체에서 사용할 수 있습니다. HOWEVER :

귀하의 네임 스페이스는 PSR-1 규정을 위반합니다. 이는 StudlyCaps을 사용하지 않기 때문입니다. BAD

: use App\Helpers\api\gg\gg

좋은 : use App\Helpers\Api\GG\GG.

그에 따라 폴더/파일의 이름을 바꿉니다. 정렬 된 상태에서 바인드 함수는 실제로 singleton으로 변경되어야합니다. 이는 재사용 가능한 모델이 아닌 지속적인 상태를 원하기 때문입니다.

또한 모든 기능에 ->isReady()을 확인 안
$this->app->singleton(GG::class, function(){ 
    return new GG; 
}); 

, 즉는 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', '[email protected]')->middleware('gg_ready'); 

또는 컨트롤러에서 사용 :

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

내가 시도 할 것이다. 감사 – Hanik