1. Erstellung von Controllern
1.1 Was ist ein Controller?
Ein Controller ist eine PHP-Klasse, die eine oder mehrere Methoden enthält, die Aktionen genannt werden. Jede Aktion entspricht in der Regel einer Route und reagiert auf eine bestimmte Art von HTTP-Anfrage.
1.2 Voraussetzungen
- Namespace: Controller-Klassen befinden sich normalerweise im Namespace
App\Controller
. - Basis-Klasse: Es ist üblich, dass Controller die Klasse
AbstractController
erweitern, die hilfreiche Methoden bereitstellt.
1.3 Erstellen eines einfachen Controllers
Schritt-für-Schritt-Anleitung:
1. Erstellen der Controller-Klasse:- Erstellen Sie eine neue PHP-Datei im Verzeichnis
src/Controller/
, z. B.src/Controller/HelloController.php
.
2. Definieren Sie den Namespace und die Verwendungsklassen:
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
3. Erstellen der Controller-Klasse und Erben von AbstractController:
class HelloController extends AbstractController
{
// Aktionen werden hier definiert
}
4. Definieren einer Aktion mit einer Route:
/**
* @Route("/hello/{name}", name="hello")
*/
public function index($name)
{
return new Response('Hallo ' . $name . '!');
}
Vollständiges Beispiel:
// src/Controller/HelloController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class HelloController extends AbstractController
{
/**
* @Route("/hello/{name}", name="hello")
*/
public function index($name)
{
return new Response('Hallo ' . $name . '!');
}
}
1.4 Generieren eines Controllers mit dem Maker-Bundle
Das Maker-Bundle vereinfacht die Erstellung von Controllern.
Installation des Maker-Bundles:
composer require symfony/maker-bundle --dev
Generieren eines Controllers:
php bin/console make:controller GreetingController
Dies erstellt src/Controller/GreetingController.php
mit einer Beispielaktion und einer zugehörigen Template-Datei.
2. Verständnis der Request- und Response-Objekte
2.1 Das Request-Objekt
Das Request
-Objekt repräsentiert eine HTTP-Anfrage und enthält Informationen wie GET/POST-Parameter, Cookies, Header usw.
Zugriff auf das Request-Objekt:
use Symfony\Component\HttpFoundation\Request;
public function index(Request $request)
{
$name = $request->query->get('name', 'Gast');
// ...
}
Beispiele für die Verwendung:
GET-Parameter abrufen:
$page = $request->query->get('page', 1);
POST-Parameter abrufen:
$data = $request->request->get('form_field');
Dateien abrufen:
$file = $request->files->get('uploaded_file');
2.2 Das Response-Objekt
Das Response
-Objekt repräsentiert eine HTTP-Antwort und enthält den Inhalt, HTTP-Statuscode und Header.
Erstellen einer einfachen Antwort:
use Symfony\Component\HttpFoundation\Response;
public function index()
{
return new Response('Inhalt der Antwort', Response::HTTP_OK, ['content-type' => 'text/html']);
}
Anpassen der Antwort:
Statuscode ändern:
return new Response('Seite nicht gefunden', Response::HTTP_NOT_FOUND);
Header hinzufügen:
$response = new Response('Inhalt');
$response->headers->set('X-Custom-Header', 'Wert');
return $response;
2.3 Abhängigkeitsspritze (Dependency Injection)
Symfony injiziert automatisch das Request
-Objekt, wenn Sie es als Parameter in Ihrer Controller-Methode definieren.
3. Rendering von Templates und Rückgabe von JSON-Antworten
3.1 Rendering von Templates
Symfony verwendet standardmäßig Twig als Template-Engine.
Beispiel:
public function index()
{
return $this->render('greeting/index.html.twig', [
'name' => 'Welt',
]);
}
Erklärung:
render()
-Methode: Wird vonAbstractController
bereitgestellt.- Template-Pfad: Relativ zum Verzeichnis
templates/
. - Variablen: Ein assoziatives Array, das an das Template übergeben wird.
Beispiel-Template templates/greeting/index.html.twig
:
<!DOCTYPE html>
<html>
<head>
<title>Begrüßung</title>
</head>
<body>
<h1>Hallo {{ name }}!</h1>
</body>
</html>
3.2 Rückgabe von JSON-Antworten
Für APIs oder AJAX-Anfragen ist es oft notwendig, JSON-Daten zurückzugeben.
Verwendung der json()
-Methode:
public function apiResponse()
{
$data = [
'success' => true,
'message' => 'Daten erfolgreich abgerufen',
'data' => [1, 2, 3, 4, 5],
];
return $this->json($data);
}
Erklärung:
json()
-Methode: Wird vonAbstractController
bereitgestellt und erstellt eineJsonResponse
.
Direkte Verwendung von JsonResponse
:
use Symfony\Component\HttpFoundation\JsonResponse;
public function apiResponse()
{
$data = ['status' => 'ok'];
return new JsonResponse($data);
}
3.3 Einstellung von Headern und Statuscodes
Anpassung der JSON-Antwort:
return $this->json($data, Response::HTTP_CREATED, ['X-Custom-Header' => 'Wert']);
4. Weiterleitungen und Weiterleitungen (Redirecting und Forwarding)
4.1 Weiterleitungen (Redirecting)
Eine Weiterleitung weist den Browser an, eine neue URL aufzurufen.
Verwendung der redirectToRoute()
-Methode:
public function oldRoute()
{
return $this->redirectToRoute('new_route_name');
}
Verwendung der redirect()
-Methode mit URL:
public function externalRedirect()
{
return $this->redirect('https://www.beispiel.de');
}
4.2 Weiterleitungen (Forwarding)
Ein Forward leitet die Anfrage intern an einen anderen Controller weiter, ohne dass der Browser davon erfährt.
Verwendung der forward()
-Methode:
public function index()
{
return $this->forward('App\Controller\OtherController::otherAction', [
'parameter1' => $value1,
]);
}
Erklärung:
- Keine HTTP-Weiterleitung: Der Browser bleibt auf derselben URL.
- Parameterübergabe: Sie können Parameter an die weitergeleitete Aktion übergeben.
4.3 Unterschied zwischen Redirect und Forward
- Redirect: Sendet einen HTTP-Statuscode (z. B. 302), der den Browser anweist, eine neue URL zu laden.
- Forward: Interne Weiterleitung auf Server-Seite, der Browser merkt nichts davon.
5. Best Practices für Controller
5.1 Single Responsibility Principle
Ein Controller sollte sich nur um die Verarbeitung der Anfrage und die Erstellung der Antwort kümmern. Geschäftslogik sollte in Services ausgelagert werden.
Beispiel:
public function calculateTotal(OrderService $orderService, $orderId)
{
$total = $orderService->calculateOrderTotal($orderId);
return new Response('Gesamtsumme: ' . $total);
}
5.2 Verwenden von Services und Dependency Injection
- Services einbinden: Nutzen Sie Konstruktor-Injection oder Methoden-Injection, um Services in den Controller zu bringen.
Konstruktor-Injection:
private $mailer;
public function __construct(MailerInterface $mailer)
{
$this->mailer = $mailer;
}
Methoden-Injection:
public function sendEmail(MailerInterface $mailer)
{
// ...
}
5.3 Typisierung und Parameter
- Parameter typisieren: Nutzen Sie Typdeklarationen für Parameter und Rückgabewerte, um den Code robust zu machen.
Beispiel:
public function show(int $id): Response
{
// ...
}
5.4 Error Handling
- Exception Handling: Verwenden Sie Exceptions, um Fehler zu handhaben, und lassen Sie Symfony die Fehlerseiten rendern.
Beispiel:
public function findUser($id)
{
$user = $this->getUserById($id);
if (!$user) {
throw $this->createNotFoundException('Benutzer nicht gefunden');
}
// ...
}
5.5 Sicherheitsüberlegungen
- Eingaben validieren: Validieren Sie Benutzereingaben sorgfältig, um Sicherheitslücken zu vermeiden.
- CSRF-Schutz: Bei Formularen und Aktionen, die Daten ändern, sollten CSRF-Tokens verwendet werden.
5.6 Verwendung von ParamConverter
Der ParamConverter ermöglicht es, Request-Parameter automatisch in Objekte zu konvertieren.
Beispiel:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
/**
* @Route("/user/{id}", name="user_show")
* @ParamConverter("user", class="App\Entity\User")
*/
public function show(User $user)
{
// $user ist eine Instanz von App\Entity\User
}
5.7 RESTful Controller
- HTTP-Methoden nutzen: Verwenden Sie die entsprechenden HTTP-Methoden (GET, POST, PUT, DELETE).
- Methodenbeschränkungen: Begrenzen Sie die akzeptierten Methoden mit dem
methods
Parameter in der Route.
Beispiel:
/**
* @Route("/api/resource", methods={"POST"})
*/
public function createResource()
{
// ...
}
Zusammenfassung
Controller in Symfony sind das Herzstück der Anwendungslogik und verbinden die eingehenden Anfragen mit der entsprechenden Verarbeitung und Ausgabe. Durch das Verständnis der folgenden Punkte können Sie effektive und wartbare Controller erstellen:
- Erstellung von Controllern: Nutzen Sie die bereitgestellten Werkzeuge und folgen Sie den Konventionen.
- Request und Response: Verstehen Sie, wie Sie auf Anfragedaten zugreifen und Antworten erstellen.
- Templates und JSON: Wissen Sie, wie Sie Inhalte rendern und unterschiedliche Antwortformate zurückgeben.
- Weiterleitungen: Nutzen Sie Redirects und Forwards, um den Benutzerfluss zu steuern.
- Best Practices: Halten Sie Ihre Controller schlank, nutzen Sie Services, typisieren Sie Ihren Code und beachten Sie Sicherheitsaspekte.