mergeConfigFrom( base_path('config/search.php'), 'search' ); // Register the SearchService as a singleton (Manager pattern) $this->app->singleton(SearchService::class, function (Application $app) { return new SearchService($app); }); // Bind the interface to the SearchService $this->app->singleton(SearchServiceInterface::class, function (Application $app) { return $app->make(SearchService::class); }); // Bind SearchDriverInterface to current driver $this->app->bind(SearchDriverInterface::class, function (Application $app) { return $app->make(SearchService::class)->driver(); }); // Register the MediaSearchService for optimized movie/TV searches $this->app->singleton(MediaSearchService::class, function (Application $app) { return new MediaSearchService; }); // Register individual drivers as singletons for direct access $this->app->singleton(ManticoreSearchDriver::class, function (Application $app) { $config = config('search.drivers.manticore', []); return new ManticoreSearchDriver($config); }); $this->app->singleton(ElasticSearchDriver::class, function (Application $app) { $config = config('search.drivers.elasticsearch', []); return new ElasticSearchDriver($config); }); $this->app->singleton('elasticsearch', function (): Client { $config = config('search.drivers.elasticsearch', []); $clientBuilder = ClientBuilder::create(); $clientBuilder->setHosts($config['hosts'] ?? []); $clientBuilder->setRetries($config['retries'] ?? 2); return $clientBuilder->build(); }); // Register aliases (using prefixed names to avoid conflicts with other packages) $this->app->alias(SearchService::class, 'search'); $this->app->alias(ManticoreSearchDriver::class, 'search.manticore'); $this->app->alias(ElasticSearchDriver::class, 'search.elasticsearch'); $this->app->alias(MediaSearchService::class, 'search.media'); } /** * Bootstrap any application services. */ public function boot(): void { // } }