app->bind(OilPredictionProvider::class, function ($app) { $logger = $app->make(ApiLogger::class); return match (config('services.llm.provider')) { 'openai' => new OpenAiPredictionProvider($logger), 'gemini' => new GeminiPredictionProvider($logger), default => new AnthropicPredictionProvider($logger), }; }); } /** * Bootstrap any application services. */ public function boot(): void { $this->configureDefaults(); Cashier::useSubscriptionModel(Subscription::class); Event::listen(WebhookReceived::class, HandleStripeWebhook::class); } /** * Configure default behaviors for production-ready applications. */ protected function configureDefaults(): void { Date::use(CarbonImmutable::class); DB::prohibitDestructiveCommands( app()->isProduction(), ); // SQLite lacks GREATEST/LEAST scalar functions — register them for tests. if (DB::connection()->getDriverName() === 'sqlite') { $pdo = DB::connection()->getPdo(); $pdo->sqliteCreateFunction('GREATEST', fn (...$args) => max($args), -1); $pdo->sqliteCreateFunction('LEAST', fn (...$args) => min($args), -1); } Password::defaults(fn (): ?Password => app()->isProduction() ? Password::min(12) ->mixedCase() ->letters() ->numbers() ->symbols() ->uncompromised() : null, ); } }