Einen Service in Symfony konfigurieren

Symfony verwendet das Service-Container-Konzept, das es uns ermöglicht, Dienste (Services) in einer zentralen Konfigurationsdatei zu definieren und zu verwalten.

Automatische Konfiguration durch Autowiring

Symfony bietet eine großartige Funktion namens Autowiring, die es uns ermöglicht, Services automatisch anhand ihrer Typen (Klassen) zu verbinden. Das bedeutet, dass Symfony automatisch erkennt, welche Abhängigkeiten (z.B. andere Services) eine Klasse benötigt, und diese bereitstellt. In einem anderen Artikel erkläre ich das explizit.

Für unseren OpenAIService könnte die Konfiguration sehr einfach sein, da wir den API-Schlüssel direkt in der Service-Klasse übergeben. Symfony erkennt diesen Service automatisch, sobald er im src/Service-Verzeichnis liegt.

Manuelle Konfiguration

Falls Sie Ihren Service jedoch manuell konfigurieren möchten, oder wenn Ihr Service spezielle Parameter benötigt, können Sie dies in der config/services.yaml-Datei tun. Hier ein Beispiel:

# config/services.yaml

services:
    App\Service\OpenAIService:
        arguments:
            $apiKey: '%env(OPENAI_API_KEY)%'

In diesem Beispiel sagen wir Symfony, dass es den OpenAIService mit einem API-Schlüssel initialisieren soll, der aus der Umgebungsvariablen OPENAI_API_KEY geladen wird. Diese Umgebungsvariable könnte beispielsweise in Ihrer .env-Datei definiert sein:

# .env

OPENAI_API_KEY=your-openai-api-key

Nutzung des Services im Controller

Da der Service jetzt im Symfony-Container registriert ist, können wir ihn in jedem Controller, der ihn benötigt, durch Dependency Injection (DI) verwenden. Das bedeutet, dass wir einfach den Service als Parameter in den Controller-Konstruktor einfügen können:

namespace App\Controller;

use App\Service\OpenAIService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class AIController extends AbstractController
{
    private $openAIService;

    public function __construct(OpenAIService $openAIService)
    {
        $this->openAIService = $openAIService;
    }

    /**
     * @Route("/generate-text", name="generate_text")
     */
    public function generateText(): Response
    {
        $prompt = "Erstelle eine kurze Geschichte über einen Entwickler, der OpenAI nutzt.";
        $text = $this->openAIService->generateText($prompt);

        return new Response($text);
    }
}

Symfony kümmert sich um die Bereitstellung des OpenAIService-Objekts, und Sie können es einfach in Ihrer Anwendung verwenden.

Fazit: Services konfigurieren leicht gemacht

Symfony macht es uns leicht, Dienste zu konfigurieren und zu verwalten. Ob automatisch durch Autowiring oder manuell über Konfigurationsdateien – mit Symfony haben Sie die volle Kontrolle darüber, wie Ihre Services erstellt und verwendet werden. Das Beispiel mit OpenAI zeigt, wie mächtig und flexibel dieses System ist, und es ermöglicht Ihnen, Ihre Anwendungen schnell und effizient mit neuen Funktionen zu erweitern.