품목

Laravel의 서비스 제공자: 정의 및 Laravel에서 서비스 제공자를 사용하는 방법

Laravel 서비스 제공자는 애플리케이션이 시작되는 중심 장소입니다. 즉, laravel 핵심 서비스 및 애플리케이션 서비스, 클래스 및 해당 종속성은 공급자를 통해 서비스 컨테이너로 푸시됩니다. 

즉, 서비스 제공자는 Laravel이라는 엔진의 "서비스 컨테이너"라는 탱크에 "클래스"연료를 붓는 깔때기와 같습니다.

config/app.php를 열면 "provider"라는 이름의 배열이 표시됩니다.

'providers' => [

        /*
        * Laravel Framework Service Providers...
        */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        .
        .
        .
],

이들은 laravel과 함께 제공되는 서비스 제공자, 즉 서비스 컨테이너에 배치되는 기본 서비스 중 일부입니다.

Quando I service provider 그들은 수행됩니까?

설명서를 보자면 요청 시 수명 주기 , 시작 시 다음 파일이 실행됩니다.

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php 그리고 그의 Middlewares
  • Service Providers: 이 글의 내용

QUALI service provider 로드되었습니까? 

그들은 그 defi배열의 nites config/app.php:

return [
 
    // ... other configuration values
 
    'providers' => [
 
        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
 
        // ... other framework providers from /vendor
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,
 
        /*
         * PUBLIC Service Providers - the ones we mentioned above
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
    ],
 
];

보시다시피 목록이 있습니다. service provider 폴더에 공개되지 않음 /vendor, 우리는 그것들을 만지거나 수정해서는 안됩니다. 우리가 관심을 갖는 것은 다음과 같습니다. BroadcastServicerProvider 거의 사용되지 않기 때문에 기본적으로 비활성화되어 있습니다.

이 모든 서비스 공급자는 위에서 아래로 실행되며 목록을 반복합니다. 두번:

  • 첫 번째 반복은 선택적 방법을 찾고 있습니다. register(), 메소드 이전에 구성된 것을 (결국) 실행하는 데 유용합니다. boot().
  • 두 번째 반복은 메서드를 실행합니다. boot() 모든 공급자의. 다시 한 번, 배열의 위에서 아래로 하나씩 'providers'.
  • 마지막으로 모든 서비스 제공자가 처리된 후 Laravel은 경로(라우트) 구문 분석, 컨트롤러 실행, 템플릿 사용 등으로 이동합니다.

서비스 제공자 Laravel predefi니티

I Service Providers Laravel에 포함되어 있으며 폴더에 있는 모든 항목입니다. app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

각각 고유한 주제와 관련된 모든 PHP 클래스입니다. App, Auth, Broadcasting, Events e Routes. 그러나 그들은 모두 한 가지 공통점이 있습니다: 방법 boot().

해당 메서드 내에서 해당 섹션과 관련된 모든 코드를 작성할 수 있습니다. auth, events, route, 등. 즉, 서비스 공급자는 일부 전역 기능을 등록하는 클래스일 뿐입니다.

애플리케이션 수명 주기의 매우 초기에 실행되기 때문에 "제공자"로 분리되어 있으므로 실행 스크립트가 모델 또는 컨트롤러에 도달하기 전에 여기에서 전역적인 것이 편리합니다.

대부분의 기능은 RouteServiceProvider에 있으며 코드는 다음과 같습니다.

class RouteServiceProvider extends ServiceProvider
{
    public const HOME = '/dashboard';
 
    public function boot()
    {
        $this->configureRateLimiting();
 
        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->group(base_path('routes/api.php'));
 
            Route::middleware('web')
                ->group(base_path('routes/web.php'));
        });
    }
 
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });
    }
}

파일이 구성되는 클래스입니다. route,와 routes/web.phproutes/api.php 기본적으로 포함defi니타. API의 경우 다른 구성도 있습니다. 끝점 접두사 /api 및 미들웨어 api 모두를위한 routes.

우리는 편집할 수 있습니다 service providers, 폴더에 없는 /vendor. 경로가 많고 특정 파일로 분리하려는 경우 이러한 파일을 사용자 지정합니다. 당신은 창조 routes/auth.php 거기에 경로를 넣은 다음 메서드에서 해당 파일을 "활성화"합니다. boot() di RouteServiceProvider, 세 번째 문장을 추가하십시오.

`Route::middleware('web') // or maybe you want another middleware?
    ->group(base_path('routes/auth.php'));

AppServiceProvider 비어 있습니다. 코드 추가의 전형적인 예 AppServiceProvider, Eloquent에서 지연 로딩 비활성화에 관한 것입니다. 이렇게하려면 다음이 필요합니다. 두 줄 추가 방법에서 boot():

혁신 뉴스레터
혁신에 관한 가장 중요한 뉴스를 놓치지 마세요. 이메일로 받으려면 가입하세요.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

관계 모델이 로드되지 않으면 예외가 발생합니다.

직접 만들어 봐 service provider 사용자 정의

사전 파일 외에도definites, 우리는 쉽게 새로운 것을 만들 수 있습니다 Service Provider, 이전 주제 이외의 다른 주제와 관련된defi로 완료 auth/event/routes.

상당히 일반적인 예는 보기 구성입니다. Blade. 지시문을 만들 수 있습니다. Blade, 그런 다음 해당 코드를 메서드에 추가합니다. boot() 어떤 service provider, 기본값 포함 AppServiceProvider. 이제 ViewServiceProvider 분리.

다음 명령으로 생성할 수 있습니다.

php artisan make:provider ViewServiceProvider

사전에 클래스를 생성합니다.defi밤:

namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
 
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

내부에서 볼 수 있듯이 두 가지 방법이 있습니다.

레지스터() 메서드

register() 메서드를 사용하면 다음을 수행할 수 있습니다. defi서비스 컨테이너에 대한 링크를 완료합니다. 예를 들어, 다음 코드에서:

public function register()
{
    $this->app->singleton(my_class, function($app){
        return new MyClass($app);
    });
}

$this->app은 싱글톤 클래스가 앱을 통해 접근할 수 있는 laravel의 전역 변수입니다.

싱글톤은 기능입니다. 이 기능을 적용할 때 앱에서 매개변수로 전달되는 클래스는 전체 애플리케이션에서 인스턴스가 하나만 있어야 함을 애플리케이션에 알립니다. 이는 MyClass가 한 번 확인되고 my_class 변수를 사용하여 액세스할 수 있는 인스턴스가 하나만 있음을 의미합니다.

부트() 메서드

boot() 메서드를 사용하면 register 메서드를 사용하여 이전에 등록한 모든 서비스에 액세스할 수 있습니다. 그런 다음 이 방법을 사용하여 애플리케이션에 전체 서비스를 포함할 수 있습니다.

이전 예제로 돌아가서 메서드를 제거해 보겠습니다. register() 그리고 이내 boot() Blade 지시문 코드를 추가합니다.

use Illuminate\Support\Facades\Blade;
 
public function boot()
{
    Blade::directive('datetime', function ($expression) {
        return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
    });
}

의 또 다른 예 ViewServiceProvider 그것은 우려 View Composers, 여기에 스 니펫이 있습니다 라라벨 공식 사이트에서 :

use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // Using class based composers...
        View::composer('profile', ProfileComposer::class);
 
        // Using closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }
}

실행하려면 이 새 공급자를 제공자 배열에 추가/등록해야 합니다. config/app.php:

return [
    // ... other configuration values
 
    'providers' => [
 
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
        // Add your provider here
        App\Providers\ViewServiceProvider::class,
    ],
];

Ercole Palmeri

관심이있을 수도 있습니다.

혁신 뉴스레터
혁신에 관한 가장 중요한 뉴스를 놓치지 마세요. 이메일로 받으려면 가입하세요.

최근 기사

미래가 여기에 있습니다: 해운 산업이 글로벌 경제를 어떻게 혁신하고 있습니까?

해군 부문은 150억 시장을 향해 항해해온 진정한 글로벌 경제강국입니다.

1 월 2024

출판사와 OpenAI, 인공지능이 처리하는 정보의 흐름을 규제하기 위한 계약 체결

지난 월요일, Financial Times는 OpenAI와의 계약을 발표했습니다. FT는 세계적 수준의 저널리즘에 라이선스를 부여합니다…

4월 30 2024

온라인 결제: 스트리밍 서비스를 통해 영원히 결제하는 방법은 다음과 같습니다.

수백만 명의 사람들이 스트리밍 서비스 비용을 지불하고 월간 구독료를 지불합니다. 당신은…

4월 29 2024

Veeam은 보호부터 대응, 복구까지 랜섬웨어에 대한 가장 포괄적인 지원을 제공합니다.

Coveware by Veeam은 계속해서 사이버 강탈 사건 대응 서비스를 제공할 것입니다. Coveware는 법의학 및 교정 기능을 제공할 것입니다…

4월 23 2024