[Laravel] 사용자 ServiceProvider 만들기

[Laravel] 사용자 ServiceProvider 만들기 updated_at: 2024-09-13 11:06

사용자 ServiceProvider 만들기

ServiceProvider

기본적인 형태

namespace Pondol\Bbs;
use Illuminate\Support\ServiceProvider;

class BbsServiceProvider extends ServiceProvider {

  public function register()
  {
  }

  public function boot()
  {
  }
}

register vs boot

실행순서는 register()메소드 가 먼저 실행되고 boot()메소드가 실행됩니다.
register 메서드는 컨테이너에 서비스를 등록하는 데만 사용해야 합니다.
boot 메서드 내에서는 이벤트 리스너 등록, 경로 파일 포함, 필터 등록 또는 다른 모든 작업이 가능합니다.

상세설명

namespace Pondol\Bbs;
use Illuminate\Support\ServiceProvider;

class BbsServiceProvider extends ServiceProvider {
  public function register()
  {
    $this->app->bind('bbs', function($app) {
      return new Bbs;
    });
  }

  public function boot()
  {
    if (!$this->app->routesAreCached()) {
      require_once __DIR__ . '/Https/routes/web.php';
      require_once __DIR__ . '/Https/routes/api.php';
    }

    $this->loadMigrationsFrom(__DIR__.'/migrations/'); // migrations 디렉토리에 있는 모든 파일들을 마이그래이션 한다.
    \Artisan::call('migrate'); // midration 파일들로 부터 db create or update


    // set assets
    $this->publishes([
      __DIR__.'/Https/public/assets/' => public_path('assets/pondol/bbs'),
    ], 'public');

    // copy config
    $this->publishes([
      __DIR__.'/Https/config/bbs.php' => config_path('bbs.php'),
    ], 'public');


    // LOAD THE VIEWS
    // - first the published views (in case they have any changes)
    $this->publishes([
      __DIR__.'/resources/views/bbs' => resource_path('views/bbs'),
    ]);
    // - loadViews  : 상기와 다른 점음  resources/views/bbs 에 없을 경우 아래 것에서 처리한다. for user modify
    $this->loadViewsFrom(__DIR__.'/resources/views/bbs', 'bbs');

    $this->publishes([
      __DIR__.'/Https/Controllers/Bbs/' => app_path('Http/Controllers/Bbs'),
    ]);
  }
}

Resources

리소스 파일들은 boot() 안에 넣어 둔다.

config

아래는 config 파일을 활용하는 두가지 예 (publishes, mergeConfigFrom) 이다.
publishes 는 현재 배포하는 패키지의 config 파일을 laravel application에서 사용하는 config path에다가 copy 하는 것이다.
이렇게 함으로서 배포된 패키지를 사용하는 사용자들은 쉽게 config를 변경할 수 있다.

public function boot(): void
{
  $this->publishes([
    __DIR__.'/../config/courier.php' => config_path('courier.php'),
  ]);
}

그러면 mergeConfigFrom 은 왜 사용하는 것일까?
버전업등이나 사용자의 실수(?) 등으로 특정 변수등이 필요한 경우 현재 배포중인 패키지의 config에서 값을 가져오게 하는 것이다.
즉, 기존 config에 있는 변수에 없는 값을 추가로 넣어 안정적인 서비스를 운영할때 필요한 명령이다.

public function register(): void
{
  $this->mergeConfigFrom(
    __DIR__.'/../config/courier.php', 'courier'
  );
}

routes

패키지에 경로가 포함된 경우 loadRoutesFrom 메서드를 사용하여 경로를 로드할 수 있습니다. 이 메소드는 애플리케이션의 경로가 캐시되었는지 자동으로 확인하고 경로가 이미 캐시된 경우 경로 파일을 로드하지 않습니다.

public function boot(): void
{
  $this->loadRoutesFrom(__DIR__.'/../routes/web.php');
}

예전에는 아래와 같은 방법으로도 사용했지만 현재는 위의 방법을 추천드립니다.

public function boot()
{
  if (!$this->app->routesAreCached()) {
    require_once __DIR__ . '/Https/routes/web.php';
    require_once __DIR__ . '/Https/routes/api.php';
  }
}

Migrations

데이타베이스 마이그레이션이 필요한 경우 사용합니다.

public function boot(): void
{
  $this->publishesMigrations([
    __DIR__.'/../database/migrations' => database_path('migrations'),
  ]);
}

언어파일(Language Files)

public function boot(): void
{
  $this->loadTranslationsFrom(__DIR__.'/../lang', 'courier');
}

blade에서 호출시 아래와 같이 하시면 됩니다.

echo trans('courier::messages.welcome');

Views

뷰 가 있는 위치를 나타낸다.

/**
 * Bootstrap any package services.
 */
public function boot(): void
{
    $this->loadViewsFrom(__DIR__.'/../resources/views', 'courier');
}

컨트롤러에서 아래처럼 호출하면 된다.

Route::get('/dashboard', function () {
  return view('courier::dashboard');
});

View Components

use Illuminate\Support\Facades\Blade;
use VendorPackage\View\Components\AlertComponent;
 
/**
 * Bootstrap your package's services.
 */
public function boot(): void
{
  Blade::component('package-alert', AlertComponent::class);
}
  • blade에서는 아래와 같이 사용하시면 됩니다.
<x-package-alert/>
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글