Wenn es auch nicht schädlich ist, sich in Symfony einzuarbeiten, ist es meiner Ansicht nach nicht zwingend notwendig. Du musst nur zwei Dateien anlegen und kannst dann (erstmal) arbeiten wie unter Contao 3.
Du legst ein Bundle (Ordner) in /src an. Nennst Du Dein Bundle AppBundle (wie von Symfony vorgeschlagen), wird es von Contao auch automatisch (glaube ich) erkannt. Du kannst aber auch einen beliebigen anderen Namen wählen (gefällt mir besser). Diese Vorgehensweise beschreibe ich mal hier.
Meine Beschreibung bezieht sich auf eine Erweiterung, die nicht auf Github veröffentlicht wird, sondern nur im eigenen Projekt verwendet wird. Das Schreiben von Erweiterungen für Github / Packagist weicht teilweise davon ab:
Also:
Anlegen von
/src/DeinName/Test
/src/DeinName/Test/Resources
/src/DeinName/Test/Resources/contao
/src/DeinName/Test/Resources/public
Im Ordner Resources/contao schreibst Du ganz normal deine Erweiterung mit den Ordnern dca, languages, models, modules, etc.
Test kann in diesem Fall der Name deiner Erweiterung sein oder besser ein Namespace-Name. Also eine Bezeichnung, z.B. CRM, wenn es in Deiner Erweiterung um ein CRM geht.
Damit deine Erweiterung als Bundle von Symfony geladen werden kann, benötigst Du noch folgende Datei:
/src/DeinName/Test/TestBundle.php
PHP-Code:
<?php
namespace DeinName\Test;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class TestBundle extends Bundle
{
}
Ja, die Klasse ist leer. Das ist richtig so.
Damit das Symfony Bundle nun auch von Contao geladen wird, musst Du sie noch bekannt machen. Contao sucht automatisch nach einem globalen ContaoManagerPlugin (und sonst nichts). Mit diesem Plugin registriert man sein(e) Bundle(s).
/src/ContaoManager/ContaoManagerPlugin.php
PHP-Code:
<?php
use Contao\ManagerPlugin\Bundle\Config\BundleConfig;
use Contao\ManagerPlugin\Bundle\BundlePluginInterface;
use Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
use Contao\CoreBundle\ContaoCoreBundle;
use DeinName\Test\TestBundle;
class ContaoManagerPlugin implements BundlePluginInterface
{
public function getBundles(ParserInterface $parser)
{
return [
BundleConfig::create(TestBundle::class)->setLoadAfter([ContaoCoreBundle::class]
)
];
}
}
Wichtig:
Wo Du das ContaoManagerPlugin speicherst, ist völlig egal. Die Klasse muss aber im globalen Namespace stehen, also hier keinen Namespace angeben. Daher speichere ich das ContaoManagerPlugin nicht in meinem Namespace, sondern direkt in /src/ContaoManager/ContaoManagerPlugin.php
TestBundle::class hat übrigens die gleiche Funktion wie "\DeinName\TestBundle"
(die Einen schreiben es so, die anderen so)
Jetzt muss Du noch dafür sorgen, dass deine PHP Klassen auch gefunden werden. Dafür musst Du die composer.json im Root verändern.
Code:
"autoload": {
"classmap": [
"src/ContaoManager/ContaoManagerPlugin.php",
"src/DeinName/Test/Resources/contao"
],
"psr-4" : { "": "src/" },
"exclude-from-classmap": [
"src/DeinName/Test/Resources/contao/config/",
"src/DeinName/Test/Resources/contao/dca/",
"src/DeinName/Test/Resources/contao/languages/",
"src/DeinName/Test/Resources/contao/templates/"
]
},
"src/DeinName/Test/Resources/contao" sorgt dafür, dass alle Deine Klassen unterhalb von Contao (also wie früher) durch den Composer Autoloader "automatisch" (bitte unbedingt unten weiterlesen) erkannt und geladen werden. Solltest Du auf der Ebene /src/DeinName/Test weitere Klassen anlegen (mehr Symfony Style), werden sie durch die PSR-4 Angabe erkannt.
Beispiel:
/src/DeinName/Test/Hooks/InsertTags.php
In der /src/DeinName/Test/Resources/contao/config/config.php
PHP-Code:
$GLOBALS['TL_HOOKS']['replaceInsertTags'][] = array('DeinName\Test\Hooks\Inserttags', 'DeineFunktion');
Damit Deine Klassen auch tatsächlich korrekt geladen werden, ist zwingend auf der Console folgendes auszuführen:
Code:
composer dump-autoload
Dieser Befehl durchsucht Deine Ordner, registriert Deine Klassen und speichert sie in ein paar Dateien, damit nicht bei jedem Aufruf alle Verzeichnisse durchsucht werden müssen.
Nachdem Du Dein Modul eingerichtet hast, musst Du einmal den Befehl
ausführen. Contao klingt sich in diesen Composer Befehl rein und führt ein paar Scripte aus, z.B. werden ein paar Symlinks generiert. Alle deine öffentlichen Dateien zum Modul landen ja in /web. In Deinem Fall in
/web/bundles/test
Solltest Du also in Deiner Erweiterung Pfade z.B. für Icons angeben, ist der richtige Pfad:
bundles/test/icon.png
Jetzt beginnt Deine Arbeit mit der Modul-Entwicklung. Contao 3 weicht aber nicht ganz unerheblich von Contao 2 ab. Also die Grundsystematik ist schon geblieben. Aber hier kannst Du Dir wie früher auch viel bei anderen Erweiterungen abschauen.