Moin,
ich bin derzeit dabei ein Symfony-Projekt mit einem Contao aufzusetzen und stoße leider immer wieder auf Probleme.
Auch nach längerer Recherche finde ich keine wirklichen Antworten zu meinen Fragen.
Kurz zum Projekt:
In dem Projekt sollen einige statische Inhalte mit Contao angezeigt werden, aber ebenso sollen auch einige Aufgaben im Symfony Backend geschehen.
Insbesondere sollen einige Auswertungen und die Datenhaltung (neben den Contao DB-Tabellen) mit Symfony umgesetzt.
Ich mache das Projekt mit einem Partner, er arbeitet seit Jahren mit Contao, ich seit Jahren mit Symfony....man könnte meinen dass es ja dann ein Leichtes sein sollte
Das Projekt an sich habe ich aufgesetzt und soweit läuft auch alles. Hierzu hatten wir neulich schon mal ein paar andere Fragen und wir haben tolle Hilfe in diesem Forum bekommen.
Hoffentlich kann uns wieder jemand Rat geben.
1. Backend-Controller:
Ich habe hierzu ein schönes Beispiel gefunden, komme hier aber nicht zu dem was wir eigentlich erreichen wollen.
Den Backend-Controller habe ich implementiert und auch ins Contao-Menü eingebaut. Hier der Code:
PHP-Code:
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Twig\Environment as TwigEnvironment;
/**
* @Route("/contao/my-backend-route",
* name=BackendController::class,
* defaults={"_scope" = "backend"}
* )
*/
class BackendController extends AbstractController
{
private $twig;
public function __construct(TwigEnvironment $twig)
{
$this->twig = $twig;
}
public function __invoke(): Response
{
return new Response($this->twig->render(
'my_backend_route.html.twig',
[]
));
}
}
In diesem BackendModul sollen Daten verwaltet / angelegt / editiert werden. Leider reicht hier der Catalog-Manager nicht mehr aus.
Nun hatte ich mir das so vorgestellt, dass es eine Route für das Modul an sich gibt, und dazu noch weitere Routen für Useraktionen (oder vielleicht auch in einem anderen Controller).
In diesem Beispiel ist jedoch ein Controller mit "invoke()"-Methode (ADR-Pattern), wodurch natürlich nur eine Aktion zur Verfügung habe.
Wenn ich den Controller dann ohne "invoke" mit mehreren Methoden, die eigene Route-Annotations haben, umbaue, funktioniert es nicht
und ich bekomme einen Fehler. Ich habe mir das in etwa so vorgestellt:
PHP-Code:
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Twig\Environment as TwigEnvironment;
/**
* @Route("/contao/my-backend-route",
* name=BackendController::class,
* defaults={"_scope" = "backend"}
* )
*/
class BackendController extends AbstractController
{
/**
* @Route("/", name="test_test")
*/
public function test()
{
return $this->render('my_backend_route.html.twig',[]);
}
/**
* @Route("/irgendwas", name="test_test2")
*/
public function test2()
{
// Do sth else
}
}
Leider bekomme ich dann folgende Fehlermeldung:
"An exception has been thrown during the rendering of a template ("None of the chained routers were able to generate route: Route 'App\Controller\BackendController' not found")."
Gibt es hier die Möglichkeit auch "herkömmliche" Symfony-Controller mit mehreren Routen zu verwenden und wenn ja wie?
Habe irgendwo gelesen, dass das möglich ist...
2. Frontend-Controller:
Auch hier möchte ich, dass ich einen Controller habe, welcher mehrere Routes verarbeiten kann (kein invoke).
Mein Controller sieht nun so aus:
PHP-Code:
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Twig\Environment as TwigEnvironment;
/**
* @Route("/my-front-route",
* name=FrontendController::class,
* defaults={"_scope" = "frontend"}
* )
*/
class FrontendController extends AbstractController
{
private $twig;
public function __construct(TwigEnvironment $twig)
{
$this->twig = $twig;
}
public function __invoke(): Response
{
$res = $this->twig->render(
'test.html.twig',
[]
);
return new Response($res);
}
}
Leider weiss ich nicht genau, wie ich den Aufruf der Route in Contao einbinde. Ich habe es mit einem Template probiert, welches ich in einen Artikel eingebunden habe.
In diesem Template führe ich lediglich ein "file_get_contents" mit der Route aus.
Auf meinem lokalen Server bekomme ich folgende ErrorException: "Warning: file_get_contents(http://localhost:8000/my-front-route): failed to open stream: HTTP request failed!"
Für jegliche andere URL (z.B. Google) funktioniert es. Die Route an sich funktioniert und ich sehe den Inhalt meines Templates, wenn ich die Route direkt im Browser aufrufe.
Der Aufruf funktioniert nur anscheinend nicht aus Contao heraus. Wo liegt das Problem, CORS oder irgendetwas anderes Contao-spezifisches?
Lesezeichen