패키지란
Laravel에서 말하는 패키지는 애플리케이션에 기능을 추가하는 Composer 패키지입니다. 패키지는 크게 두 종류로 나뉩니다.- 스탠드얼론 패키지 — Laravel에 의존하지 않는 범용 PHP 라이브러리(예: Carbon, Pest)
- Laravel 패키지 — 라우트, 컨트롤러, 뷰, 설정 등 Laravel과 통합된 기능을 가진 패키지
패키지의 테스트를 작성할 때는 Orchestra Testbench를 사용합니다. 일반적인 Laravel 애플리케이션과 동일하게 패키지의 테스트를 작성할 수 있습니다.
패키지 자동 감지
Laravel은 패키지를 설치할 때composer.json의 extra.laravel 섹션을 읽어 서비스 프로바이더와 파사드를 자동 등록합니다.
bootstrap/providers.php를 수동으로 편집하지 않아도 패키지가 자동으로 로드됩니다.
자동 감지 비활성화
사용자 측에서 특정 패키지의 자동 감지를 비활성화하고 싶은 경우, 애플리케이션의composer.json에 설정합니다.
서비스 프로바이더의 역할
서비스 프로바이더는 패키지의 진입점입니다. 뷰, 설정, 마이그레이션, 라우트 등의 리소스를 Laravel에 등록하는 처리를 여기에 집약합니다. 서비스 프로바이더는Illuminate\Support\ServiceProvider를 상속하며, register와 boot의 두 메서드를 가집니다.
설정 파일 Publish
publishes() — 파일을 공개
boot 메서드에서 publishes()를 호출하면 사용자가 vendor:publish 명령어로 설정 파일을 자신의 애플리케이션으로 복사할 수 있습니다.
mergeConfigFrom() — 기본값과 병합
register 메서드에서 mergeConfigFrom()을 사용하면 사용자가 설정 파일을 공개하지 않은 경우에도 패키지의 기본값이 사용됩니다.
태그로 공개 그룹 나누기
publishes()의 두 번째 인자로 태그를 지정하면, 사용자가 필요한 리소스만 선택해서 공개할 수 있습니다.
라우트 등록
loadRoutesFrom()을 사용하여 라우트 파일을 로드합니다. 애플리케이션의 라우트 캐시가 활성화되어 있는 경우 자동으로 건너뜁니다.
마이그레이션 Publish
publishesMigrations()를 사용하면 마이그레이션 파일을 공개할 수 있습니다. 공개 시 Laravel이 자동으로 타임스탬프를 갱신합니다.
뷰 Publish
loadViewsFrom() — 뷰 등록
loadViewsFrom()으로 뷰 디렉터리를 등록합니다. 두 번째 인자의 네임스페이스를 사용하여 package::view 형식으로 뷰를 참조합니다.
resources/views/vendor/courier 디렉터리를 확인하고, 없으면 패키지의 뷰 디렉터리를 사용합니다. 이를 통해 사용자가 뷰를 커스터마이즈할 수 있습니다.
뷰 공개
Blade 컴포넌트 등록
컴포넌트를 패키지에 포함시키는 경우,boot 메서드에서 등록합니다.
번역 파일 Publish
loadTranslationsFrom()으로 번역 파일을 등록합니다. 번역은 package::file.key 형식으로 참조합니다.
loadJsonTranslationsFrom()을 사용합니다.
명령어 등록
패키지의 Artisan 명령어는commands() 메서드로 등록합니다. 콘솔 환경에서만 등록하는 것이 일반적입니다.
optimize 명령어에 통합
패키지가 자체 캐시를 가지고 있는 경우,optimizes() 메서드로 php artisan optimize 및 php artisan optimize:clear에 통합할 수 있습니다.
about 명령어에 정보 추가
php artisan about의 출력에 패키지 정보를 추가하려면 AboutCommand::add()를 사용합니다.
파사드 생성
파사드를 사용하면 서비스 컨테이너의 바인딩을 정적 메서드처럼 호출할 수 있습니다.1
서비스 클래스 생성
2
파사드 클래스 생성
Illuminate\Support\Facades\Facade를 상속하고, getFacadeAccessor()에서 서비스 컨테이너의 바인딩 키를 반환합니다.3
서비스 프로바이더에서 바인딩
4
composer.json에 등록
@method 어노테이션을 붙이면 IDE 자동 완성을 활용할 수 있습니다.
DeferrableProvider — 지연 로딩 구현
서비스 컨테이너에 대한 바인딩만 수행하는 프로바이더는DeferrableProvider 인터페이스를 구현하여 지연 로딩을 구현할 수 있습니다. 서비스가 실제로 필요해질 때까지 프로바이더가 로드되지 않으므로 애플리케이션의 성능이 향상됩니다.
provides()에 나열된 서비스가 해석될 때만 프로바이더가 로드됩니다.
패키지 테스트
패키지 단독으로 테스트할 때는 Orchestra Testbench를 사용합니다. 일반적인 Laravel 애플리케이션 내에 있는 것처럼 패키지의 테스트를 작성할 수 있습니다.getPackageProviders()를 오버라이드하여 패키지의 서비스 프로바이더를 등록합니다.
Composer에 배포
패키지를 Packagist에 배포하기 위한 모범 사례입니다.composer.json의 기본 설정
관련 페이지
서비스 프로바이더
서비스 프로바이더의
register와 boot 메서드, 지연 프로바이더의 세부 사항을 확인합니다.버전 호환성 관리
Laravel과 PHP의 메이저 버전 업에 대응하는 전략과 GitHub Actions의 테스트 매트릭스 설정을 설명합니다.