app->make(PluginManager::class) ->getPlugin($this->extensionIdentifier); if ($plugin !== null) { return $plugin; } return new InlinePluginExtensionAdapter($this->extensionIdentifier); } /** * Register services. */ public function register(): void { $this->ensureIdentifierAlias(); parent::register(); } /** * Bootstrap services. */ public function boot(): void { $this->ensureIdentifierAlias(); parent::boot(); } /** * `$pluginIdentifier` 값을 부모의 `$extensionIdentifier` 로 미러링합니다. */ private function ensureIdentifierAlias(): void { if (isset($this->pluginIdentifier) && ! isset($this->extensionIdentifier)) { $this->extensionIdentifier = $this->pluginIdentifier; } } } /** * PluginManager 가 식별자에 해당하는 플러그인 인스턴스를 보유하지 않는 컨텍스트 * (테스트 격리 / 플러그인 디스커버리 이전 컨테이너 해석 등) 에서 사용되는 어댑터. * * AbstractPlugin::getCache() / getStorage() 의 기본 구현과 동일한 키 prefix 와 * 디스크 정책을 따르도록 PluginCacheDriver / PluginStorageDriver 를 식별자만으로 * 직접 생성합니다. * * @internal BasePluginServiceProvider 의 fallback 전용. 외부에서 직접 참조하지 마세요. */ final class InlinePluginExtensionAdapter implements CacheableExtensionInterface { private ?CacheInterface $cache = null; private ?StorageInterface $storage = null; /** * @param string $identifier 플러그인 식별자 (vendor-plugin) */ public function __construct(private readonly string $identifier) {} /** * 플러그인 식별자를 반환합니다. * * @return string 플러그인 식별자 */ public function getIdentifier(): string { return $this->identifier; } /** * 플러그인 도메인 캐시 드라이버를 반환합니다. * * @return CacheInterface PluginCacheDriver 인스턴스 */ public function getCache(): CacheInterface { return $this->cache ??= new PluginCacheDriver($this->identifier); } /** * 플러그인 도메인 스토리지 드라이버를 반환합니다. * * @return StorageInterface PluginStorageDriver 인스턴스 */ public function getStorage(): StorageInterface { return $this->storage ??= new PluginStorageDriver($this->identifier); } /** * 카테고리별 스토리지 드라이버를 반환합니다. * * fallback 어댑터는 플러그인 인스턴스(오버라이드 지점)가 없으므로 기본 스토리지를 그대로 반환합니다. * * @param string $category 카테고리 * @return StorageInterface 기본 디스크의 스토리지 인스턴스 */ public function getStorageFor(string $category): StorageInterface { return $this->getStorage(); } }