Suche…


Einführung

Ein Controller in Symfony ist ein aufrufbares PHP (eine Funktion, eine Methode für ein Objekt oder ein Abschluss), das eine HTTP-Anforderung empfängt und eine HTTP-Antwort zurückgibt. Eine HTTP-Antwort kann alles enthalten: eine HTML-Seite, eine JSON-Zeichenfolge, ein Dateidownload usw.

Um Symfony mitzuteilen, welcher Controller eine bestimmte Anforderung verarbeiten soll, müssen Sie eine Route konfigurieren .

Syntax

  • $ this-> generateUrl ('route_name', ['placeholder' => 'value']); // generiert eine URL für die Route route_name mit einem Platzhalter
  • $ this-> render ('template.html.twig'); // rendert eine Twig-Vorlage und gibt ein Response-Objekt zurück
  • $ this-> render ('template.html.twig', ['parameter' => $ value]); // rendert eine Twig-Vorlage mit einem Parameter
  • $ this-> createNotFoundException ('Message') werfen; // löst eine NotFoundHttpException aus, die dazu führt, dass Symfony eine 404-Antwort zurückgibt

Bemerkungen

Controller sollten klein sein und sich auf die Verarbeitung von HTTP-Anforderungen konzentrieren. Die eigentliche Geschäftslogik Ihrer Anwendung sollte an verschiedene Teile Ihrer Anwendung delegiert werden, beispielsweise an Ihr Domänenmodell.

Eine einfache Controller-Klasse

// src/AppBundle/Controller/HelloWorldController.php
namespace AppBundle\Controller;

use Symfony\Component\HttpFoundation\Response;

class HelloWorldController
{
    public function helloWorldAction()
    {
        return new Response(
            '<html><body>Hello World!</body></html>'
        );
    }
}

Rendern einer Twig-Vorlage

In den meisten Fällen möchten Sie HTML-Antworten aus einer Vorlage rendern, anstatt den HTML-Code in Ihrem Controller fest zu codieren. Außerdem sind Ihre Vorlagen nicht statisch, sondern enthalten Platzhalter für Anwendungsdaten. Symfony wird standardmäßig mit Twig geliefert, einer leistungsstarken Templatesprache.

Um Twig in Ihrem Controller zu verwenden, erweitern Sie die Basis- Controller Klasse von Symfony:

// src/AppBundle/Controller/HelloWorldController.php
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class HelloWorldController extends Controller
{
    public function helloWorldAction()
    {
        $text = 'Hello World!';

        return $this->render('hello-world.html.twig', ['text' => $text]);
    }
}

Erstellen Sie die Twig-Vorlage (in app/Resources/views/hello-world.html.twig ):

<html><body>{{ text }}</body></html>

Zweig wird den automatisch ersetzen {{ text }} Platzhalter mit dem Wert des text übergibt von der Steuerung. Dadurch wird die folgende HTML-Ausgabe gerendert:

<html><body>Hello World!</body></html>

Zurückgeben einer 404-Seite (nicht gefunden)

Manchmal möchten Sie eine 404-Antwort (nicht gefunden) zurückgeben, da die angeforderte Ressource nicht vorhanden ist. Symfony ermöglicht dies durch NotFoundHttpException einer NotFoundHttpException .

Der Symfony Base Controller macht eine createNotFoundException Methode createNotFoundException , die die Ausnahme für Sie erstellt:

public function indexAction()
{
    // retrieve the object from database
    $product = ...;

    if (!$product) {
        throw $this->createNotFoundException('The product does not exist');
    }

    // continue with the normal flow if no exception is thrown
    return $this->render(...);
}

Daten aus dem Request-Objekt verwenden

Wenn Sie auf das Request Objekt zugreifen müssen (z. B. zum Lesen der Abfrageparameter, zum Lesen eines HTTP-Headers oder zum Verarbeiten einer hochgeladenen Datei), können Sie die Anforderung als Methodenargument erhalten, indem Sie ein Argument mit Typhinweis hinzufügen:

use Symfony\Component\HttpFoundation\Request;

public function indexAction(Request $request)
{
    $queryParam = $request->query->get('param');

    // ...
}

Symfony erkennt den Typhinweis und fügt das Anforderungsargument zum Controller-Aufruf hinzu.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow