Artikel
von Patrick Froch

Contao 4: Erweiterung als Bundle

In der Artikelserie über Contao 4 möchte ich meine Erfahrungen im Umgang mit Contao 4 teilen. Es handelt sich nicht um hundertfach erprobte Vorgehensweisen, die ich genau begründen kann, sondern um die Dinge, die ich mir zusammengesucht und ausprobiert habe. Für vieles gibt es vermutlich bessere Wege. Wenn Euch also etwas auffällt, gebt mir Bescheid.

Ich gehe davon aus, dass Contao richtig installiert ist und funktioniert.

Wir wollen also nun ein Symfony-Bundle erstellen, welches mit Cotnao kompatible ist und als Erweiterung erkannt wird. Wie ein Symfony-Bundle aufgebaut ist habe ich vor einiger Zeit im Artikel "Symfony2: Bundle anlegen" beschrieben. Auf die Verzeichnisstruktur bin ich unter anderem im Artikel "Symfony2: Verzeichnisstruktur" noch einmal eingegangen. Grundsätzlich schadet es dem Verständnis nicht, wenn man die Symfony-Artikel kennt, auch wenn diese schon etwas älter sind und in Teilen nicht mehr ganz aktuell.

Vorbereitung

Als erstes legen wir die Ordnerstruktur an. Die Bundles liegen in Contao 4 unter TL_ROOT/src. Dort wird ein Ordner mit dem Namspace (Acme) erstellt und darin einer mit dem Bundle (TestBundle).

Nun wird das Bundle in app/AppKernel.php registriert:

Entwicklung der Erweiterung

Nun können wir fast wie gewohnt unsere Contao-Erweiterung entwickeln, nur dass die Contao-Dateien im Bundle unter Resources/contao liegen. Ich erstelle einfach ein kleines Inhaltselement, dass einen Text ausgibt. Es wird nur das nötigste erstellt. Wer mehr über die Erstellung eines Inhaltselements wissen möchte, wird im Artikel "Contao: Ein eigenes Inhaltselement" fündig.

Konfiguration

Template

Inhaltselement

Das wars auch schon. Nun sollte unser Text ausgegeben werden. Dieses Modul ist zugegebenermaßen ziemlich nutzlos und sinnfrei. Aber zum Erläutern der Beziehung zwischen Contao und Symfony sollte es reichen. Nun kann man viele tolle Sachen machen und die Symfony-Tools einsetzen. Auf diese Dinge gehe ich in weiteren Artikeln ein.

Zurück

Einen Kommentar schreiben

Kommentar von Tenzin |

Thank you for this short article it was a nice write.

Can you do next write up on following topics.
- Difference between Contao SE & ME
- What is Contao Manager
- What is then Contao Manager Plugins
- Plugins? Bundles? or Extensions ? Oh my God...

Although there are infos on above topics available in web, but its all scattered..

Antwort von Patrick Froch

Dear Tenzin!

Because of my bad English, I answer in German. Sorry for that.

Da ich mit mit er Managed Eddtion von Contao nicht auskenne und diese aus meiner Sicht für Entwickler irrelevant ist, kann ich hier leider nicht weiterhelfen. Die restlichen Themen werde ich gerne behandeln, sobald mir etwas Zeit bleibt.

Viele Grüße,
Patrick Froch

Kommentar von Mapi |

Hallo,

Du schreibst "Die Bundles liegen in Contao 4 unter TL_ROOT/src"

Sollten die nicht unter dem Verzeichnis TL_ROOT/vendor/myname/mybundle/ liegen. Oder welches Verzeichnis ist genau mit TL_ROOT gemeint?

Viele Grüße

Antwort von Patrick Froch

Hallo Mapi,

unter TL_ROOT/vendor/ liegen die über Composer installierten Bundels/Erweiterugnen. Dort solltest Du eigentlich nichts verändern, da es sonst beim nächsten Durchlauf von Composer überschrieben wird. Die selbst entwickelten Bundles liegen in Symfony deshalb im ROOT unter /src (s. z.B. im Symfony-Handbuch unter 'Creating a Bundle').

Kommentar von Mapi |

Hallo Patrik,

der Ordner /src liegt dann neben den Ordnern /app und /web. Ich habe die Verzeichnisstruktur /src/Acme/TestBundle angelegt.
In der /app/AppKernel.php die im bundles-Array dies eingetragen:

new Acme\TestBundle\AcmeTestBundle(),

Ich habe das mal genau so angelegt wie auf der Symfony-Seite beschrieben zusätzlich noch, was hier nicht erwähnt wurde die Bundle-Datei:

<?php
// src/Acme/TestBundle/AcmeTestBundle.php
namespace Acme\TestBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeTestBundle extends Bundle
{
}

Composer wirft danach bei:
bin/console cache:clear -e prod

diesen Fehler aus:
[Symfony\Component\Debug\Exception\FatalThrowableError]
Class 'Acme\TestBundle\AcmeTestBundle' not found

Was ist da los? Fehlt hier in dem Beitrag nicht etwas?

Antwort von Patrick Froch

Hallo Mapi,

da hast Du recht, deshalb habe ich oben auf die Symfony-Artikel verlinkt. Ich hätte es hier aber wohl sicherheitshalber auch erwähnen sollen. Danke für den Hinweis.

Viele Grüße,
Patrick

Kommentar von Mapi |

Hallo Patrick,

in der composer.json im TL_ROOT sollte dann aber noch im autoload das Verzeichnis /src hinzugefügt werden, richtig?

"autoload": {
"psr-4": { "": "src/" },
}

Grüße

Antwort von Patrick Froch

Hallo Mapi,

auch richtig.

Viele Grüße,
Patrick

Was ist die Summe aus 8 und 3?