Ergebnis 1 bis 28 von 28

Thema: Contao 4 Erweiterung als Symfony-Bundle (gelöst)

  1. #1
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Frage Contao 4 Erweiterung als Symfony-Bundle (gelöst)

    Hallo zusammen,

    inzwischen kann man ja einiges lesen zu Contao 4 und wie man Erweiterungen als Symfony-Bundles erstellt:
    https://xuad.net/artikel/contao-4-bu...d-und-frontend
    http://easysolutionsit.de/artikel/co...ls-bundle.html
    https://blog.daniel-kiesel.de/blog-d...tml?_locale=de
    (vielen Dank dafür!)

    Ich fand auch den Beitrag auf dem Contao-Nordtag von Christian Schiffler sehr gut gemacht und er hat mich echt weiter gebracht:
    https://www.youtube.com/watch?v=34R7buoM_cc
    https://www.cyberspectrum.de/files/d...on_cnt2017.pdf

    Nun habe ich aber eine Frage:
    zum generellen Anlegen/Erstellen des Bundles und dessen Verortung bzw. Verzeichnisstruktur innerhalb einer Contao-Instanz.

    Wenn ich das richtig verstehe wird ein selbst entwickeltes Bundle in Contao 4 unter /src/ abgelegt. Also parallel zum Ordner /web/, /app/, /files/ usw.
    Also quasi wie im Beispiel hier genannt. Das habe ich gemacht und auch mein Bundle in der AppKernel.php registriert. Aber das funktioniert nicht ohne in der composer.json im Root dem autoload das Verzeichnis bekannt zu machen:

    Code:
    "autoload": {
       "psr-4": { "": "src/" },
    },
    Jetzt wird das Bundle anscheinend ohne Fehler geladen.
    Muss ich das immer so machen, die composer.json im Root manuell anpassen?

    Wenn ich mir mal Bundles wie z. B. Contao-eigene Calendar Bundle anschaue, dann fällt mir auf dass hier eine eigene composer.json existiert, welche ich ja nicht in meine Contao-Instanz einfach lege. Da würde ich die Eigentliche ja überschreiben. Daher lade ich es via composer require. Dazu muss es aber über composer zu laden sein -> https://packagist.org/

    Also was ist eurer Meinung nach der "Best Practice" um ein Contao-Bundle zu erstellen?
    Wie könnte ich vorgehen, wenn ich mir kein öffentliches Repository anlegen kann, aber dennoch das Bundle über Composer Contao hinzufügen möchte sodass es auch im /vendor/ Ordner landet und man nicht die composer.json im Root manuell anpacken muss?

    Grüße
    Geändert von ttcdummy (26.05.2017 um 13:09 Uhr)

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Mit Contao selbst hat das wenig zu tun.

    Es gibt dazu eine kurze Anleitung von xtra.

    Wenn du Bundles für die Managed Edition machst, hilft auch die Dokumentation oder dieser Post.

  3. #3
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Vielen Dank für die Antwort!

    Habe mich da versucht etwas weiter einzuarbeiten und bin dabei auf ein autoload-Problem gestoßen.
    Ich bin dabei dem Beispiel von xtra gefolgt und habe mein Repository unter /_external angelegt.

    In meiner composer.json des Bundles wird unter autoload:
    Code:
    "autoload": {
       "psr-4": { FooBar\\FoobarBundle\\"": "src/" },
    },
    Ich würde gerne das Doctrine ORM verwenden.
    Jetzt stelle ich fest, dass Doctrine kein PSR-4 unterstützt:
    https://github.com/doctrine/DoctrineBundle/issues/282

    Möchte man z. B.
    Code:
    bin/console doctrine:generate:enteties FooBar\FoobarBundle\Entity\Class
    aufrufen erhält man den Fehler

    Code:
    [RuntimeException]
      Can't find base path for "FooBar\FoobarBundle\Entity\Class" (path: "/[...]/_external/foobar/src/Entity", destination: "/[...]/_external/foobar/src/Entity").
    Mit PSR-0 wird das Bundle gar nicht erst geladen. Und er sucht sich an der FooBarBundle Klasse verrückt.
    Code:
    "autoload": {
       "psr-0": { "FooBar\\FoobarBundle": "src/" },
    },
    Mache ich was falsch, habe ich was übersehen?
    Geändert von ttcdummy (26.05.2017 um 09:31 Uhr)

  4. #4
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Noch mal weiter recherchiert:
    z. B.: https://de.contaowiki.org/Composer/T...achen#Autoload

    Aber immer noch keine Lösung

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Das Contao Wiki kann dir nicht helfen, weil das ja kein Contao Problem ist

    Mach doch einfach
    Code:
    "autoload": {
       "psr-4": { "": "src/" }
    }
    mit der Dateistruktur
    Code:
    src/
      FooBar/
        FooBarBundle/
          …/

  6. #6
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Ja es ist kein Contao-Problem.

    Das Doctrine ORM unterstützt PSR-4 nicht.
    Nutze ich PSR-0 wird die Klasse nicht mehr gefunden.

    Kann man auch irgendwie mit der PSR-0 arbeiten?

    Wenn ich das unter /_external/foobar/composer.json konfigurieren möchte (zum laden des _external-Verzeichnisses ist in der Root-composer.json das Repository eingebunden):

    Code:
    "autoload": {
      "psr-0": {
        "FooBar\\FooBarBundle": "src/"
      }
    },
    mit /_external/foobar/src/FooBarBundle.php

    PHP-Code:
    <?php

    namespace FooBar\FooBarBundle;
    use 
    Symfony\Component\HttpKernel\Bundle\Bundle;

    class 
    FooBarBundle extends Bundle {
    }
    Geändert von ttcdummy (26.05.2017 um 10:49 Uhr)

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Hast du es nun schon so probiert? Das wäre (aus meiner Sicht) auch die reguläre Vorgehensweise.

  8. #8
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Danke!

    Das hat funktioniert, auch mit PSR-4, oder eben PSR-0.
    Die Doctrine entities konnten erfolgreich erzeugt werden.

    Was aber wenn ich nun ein eigenes externes Bundle zur Wiederverwendung schreiben möchte, so wie das xtra hier mit dem "_external" beschrieben hat?

    Grüße
    Geändert von ttcdummy (26.05.2017 um 11:41 Uhr)

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Zitat Zitat von ttcdummy Beitrag anzeigen
    Was aber wenn ich nun ein eigenes externes Bundle zur Wiederverwendung schreiben möchte, so wie das xtra hier mit dem "_external" beschrieben hat?
    Da ändert sich ja nichts?

  10. #10
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Nicht?

    Zum Einen wird ja eine eigene composer.json (_external/foobar/composer.json) erzeugt, welche alle Einstellungen beinhaltet:

    Code:
    {
      "name": "foobar/foobar-bundle",
      "description": "",
      "homepage": "",
      "license": "",
      "version": "1.0",
      "authors": [
        {
          "name": "",
          "homepage": ""
        }
      ],
      "keywords": ["contao"],
      "support": {
      },
      "type": "contao-bundle",
      "require": {
        "php": ">=7.0",
        "contao/core-bundle": "^4.3.10"
      },
      "require-dev": {
      },
      "autoload": {
        "psr-0": {
          "": "src/"
        }
      },
      "extra": {
      }
    }
    Der Rest des Bundles liegt dann hier "_external/foobar/src".

    In der "composer.json" (im Root) das hier hinzufügen:

    Code:
    {
        "require": {
            "foobar/foobar-bundle": "1.0",
        },
        "repositories": [
            {
                "type": "path",
                "url": "_external/foobar"
            }
        ],
    }
    Wie oben zu sehen mit PSR-0 gemacht, mit dem Resulat dass er die Klasse schon gar nicht mehr findet.
    Macht man das aber mit PSR-4, wird die Klasse gefunden, aber das Doctrine ORM funktioniert nicht.

    Habe ich das was mit den Pfaden falsch gemacht?
    Geändert von ttcdummy (26.05.2017 um 12:05 Uhr)

  11. #11
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Ich sehe zumindest keinen Fehler. Übrigens ist es in dem Fall mehr oder weniger egal ob du "psr-0" oder "psr-4" nimmst. (Siehe auch https://stackoverflow.com/a/24869629/374996.)

    Poste mal einen Screenshot deiner Verzeichnis- & Dateistruktur.

  12. #12
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Hier der Screenshot:

    external_bundle.png

    In dem Fall gehe ich ja hin und installiere das Bundle per:

    Code:
    composer require foobar/foobar-bundle
    Geändert von ttcdummy (26.05.2017 um 12:04 Uhr)

  13. #13
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Die Dateistruktur ist falsch, dir fehlen die Unterordner FooBar/FooBarBundle - außer dein Bundle befindet sich im Root Namespace, was aber vermutlich nicht der Fall sein wird. Siehe nochmal mein Post von vorher

  14. #14
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Mein das wenn ich vom Root aus schaue muss es so aussehen?:

    Code:
    _external/
      FooBar/
        FooBarBundle/
    In welchem Verzeichnis hat sich dann die composer.json zu befinden?

  15. #15
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Nein nein, ich glaube du verstehst das Falsch. Die Verzeichnis Struktur eines solchen Repositorys sollte zB so sein:
    Code:
    src/
    |-- FooBar/
        |-- FooBarBundle/
            |-- …/
            |-- FooBarBundle.php
    composer.json
    In welchem Unterordner sich das befindet ist dann völlig unerheblich. Das heißt den Ordner src/ gemeinsam mit der composer.json kannst du in einen x-beliebigen Ordner geben. Wenn sich der Code in einem Git Repository befindet, hast du den Code sowieso schon in irgendeinen bestimmten Unterordner.

    Du könntest dein Repository nun zB in den Ordner /_external/foobarbundle geben. Oder auch in den Ordner /gada/lada/lälla. Insgesamt sieht es dann zB so aus:
    Code:
    external/
    |-- foobarbundle
        |-- src/
        |   |-- FooBar/
        |       |-- FooBarBundle/
        |           |-- …/
        |           |-- FooBarBundle.php
        |-- composer.json
    Oder auch
    Code:
    gada/
    |-- lada/
        |-- lälla/
            |-- src/
            |   |-- FooBar/
            |       |-- FooBarBundle/
            |           |-- …/
            |           |-- FooBarBundle.php
            |-- composer.json
    Sieh dir einfach mal die Verzeichnisstruktur anderer Repositories im Web an. zB

    Geändert von Spooky (26.05.2017 um 12:45 Uhr)

  16. #16
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Hey, vielen Dank!

    Benötige ich denn überhaupt den ganzen Unterordner-Kram mit /FooBar/FooBarBundle/ ?

    Schaue ich mir mal so ein Git-Repository an z. B. Rocksolid Custom Elements dann habe ich ein Verzeichnis src/ und darin dann direkt die Bundle-Klasse.

    So, wenn ich also theoretisch das Repository https://github.com/madeyourday/conta...ustom-elements nehmen würde und es in das _external - Verzeichnis legen würde, wäre die Struktur dann nicht so korrekt?:

    Code:
    _external/
    |-- madeyourday/
        |-- contao-rocksolid-custom-elements/
            |-- src/
            |   |-- …/
            |   |-- RockSolidCustomElementsBundle.php
            |-- composer.json
    Daher mein Ansatz der auf dem Screenshot zu sehen war.

  17. #17
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Zitat Zitat von ttcdummy Beitrag anzeigen
    Benötige ich denn überhaupt den ganzen Unterordner-Kram mit /FooBar/FooBarBundle/ ?
    Ja, weil Doctrine kein PSR-4 unterstützt.. . Brauchst du Doctrine nicht, kannst du mit PSR-4 den Namespace in einen beliebigen Ordner mappen.

  18. #18
    Contao-Nutzer Avatar von ttcdummy
    Registriert seit
    02.03.2014.
    Beiträge
    213
    User beschenken
    Wunschliste

    Standard

    Ahhh, als ob ich mich im Kreis gedreht hätte. O_o

    Ja so funktioniert das!
    Und zwar auch mit dem Doctrine ORM!

    Da habe ich immerhin etwas über "PSR-0" und "PSR-4" gelernt.

    Vielen, vielen Dank!

  19. #19
    Contao-Fan
    Registriert seit
    16.11.2012.
    Ort
    Freiburg
    Beiträge
    539

    Standard

    Hätte hierzu noch eine Frage.

    ich habe im folgendes Verzeichnis
    Code:
    src
    - Vendor
    -- NameBundle
    --- ContaoManager
    ---- Plugin.php
    --- Resources
    ---- contao
    ----- contao Standard sachen
    ---- public
    --- NameBundle.php
    --- composer.json
    die Bundle composer sieht bei mir so aus
    Code:
    ...
    "require": {
        "php": ">=5.6.0",
        "contao/core-bundle": "^4.4"
      },
      "require-dev": {
        "contao/manager-plugin": "^2.0"
      },
      "conflict": {
        "contao/manager-plugin": "<2.0 || >=3.0"
      },
      "autoload": {
        "psr-4": {
          "Vendor\\NameBundle\\": "src/"
        },
        "classmap": [
          "src/Resources/contao/"
        ],
        "exclude-from-classmap": [
          "src/Resources/contao/config/",
          "src/Resources/contao/dca/",
          "src/Resources/contao/languages/",
          "src/Resources/contao/templates/"
        ]
      },
      "extra": {
        "contao-manager-plugin": "Vendor\\NameBundle\\ContaoManager\\Plugin"
      }
    ...
    in der root composer habe ich folgende Eintrag hinzugefügt.
    Code:
    ...
    "require": {
        "Vendor/NameBundle": "@dev"
      },
      "repositories": [
        {
          "type": "path",
          "url": "src/Vendor/NameBundle"
        }
      ],
    ...
    Plugin.php
    PHP-Code:
    <?php
    namespace Vendor\NameBundle\ContaoManager;


    use 
    Contao\CoreBundle\ContaoCoreBundle;
    use 
    Contao\ManagerPlugin\Bundle\BundlePluginInterface;
    use 
    Contao\ManagerPlugin\Bundle\Config\BundleConfig;
    use 
    Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
    use 
    Vendor\NameBundle\NameBundle;

    class 
    Plugin implements BundlePluginInterface
    {
        public function 
    getBundles(ParserInterface $parser)
        {
            return [
                
    BundleConfig::create(NameBundle::class)
                    ->
    setLoadAfter(ContaoCoreBundle::class)
                    ->
    setReplace(['name'])
            ];
        }
    }
    Wenn ich dann die Seite nach einem composer Update aufrufe erhalte ich folgende Meldung
    Code:
    Contao Manager Plugin "Vendor\NameBundle\ContaoManager\Plugin" was not found.
    habe ich noch einen Schritt vergessen zu machen?
    Grüße
    Alex

  20. #20
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Poste deine gesamte Bundle composer.json. Darüberhinaus sieht der Pfad falsch aus.

  21. #21
    Contao-Fan
    Registriert seit
    16.11.2012.
    Ort
    Freiburg
    Beiträge
    539

    Standard

    das ist die gesamt composer.json vom Bundle

    Code:
    {
      "name": "Vendor/NameBundle",
      "type": "contao-bundle",
      "description": "Beschreibung",
      "license": "MIT",
      "authors": [
        {
          "name": "Name",
          "email": "info@example.de",
          "homepage": "http://www.example.de",
          "role": "Developer"
        }
      ],
      "require": {
        "php": ">=5.6.0",
        "contao/core-bundle": "^4.4"
      },
      "require-dev": {
        "contao/manager-plugin": "^2.0"
      },
      "conflict": {
        "contao/manager-plugin": "<2.0 || >=3.0"
      },
      "autoload": {
        "psr-4": {
          "Vendor\\NameBundle\\": "src/"
        },
        "classmap": [
          "src/Resources/contao/"
        ],
        "exclude-from-classmap": [
          "src/Resources/contao/config/",
          "src/Resources/contao/dca/",
          "src/Resources/contao/languages/",
          "src/Resources/contao/templates/"
        ]
      },
      "extra": {
        "contao-manager-plugin": "Vendor\\NameBundle\\ContaoManager\\Plugin"
      }
    }
    was stimmt beim Pfad nicht?

    sollte doch src/Vendor/Bundle sein oder nicht?
    Grüße
    Alex

  22. #22
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Zitat Zitat von 07alex07 Beitrag anzeigen
    sollte doch src/Vendor/Bundle sein oder nicht?
    Ich glaube nicht, dass der absolute Pfad zu deinem Repository so lautet.

  23. #23
    Contao-Fan
    Registriert seit
    16.11.2012.
    Ort
    Freiburg
    Beiträge
    539

    Standard

    Mein Verzeichnis ist so aufgebaut

    Code:
    Projekt
    |-- app
    |-- assets
    |-- files
    |-- src
         |-- Vendor
              |-- Bundle
    |-- system
    |-- templates
    |-- var
    |-- vendor
    |-- web
    Grüße
    Alex

  24. #24
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Achso, du hast dein "externes" Bundle direkt im Projekt. Ob das so funktioniert kann ich dir nicht sagen, diesen Fall hatte ich noch nie probiert.

  25. #25
    Contao-Fan
    Registriert seit
    16.11.2012.
    Ort
    Freiburg
    Beiträge
    539

    Standard

    Es wird ein Symlink unter Vendor/Vendorname/BundleName/ angelegt. Und darin sieht das Verzeichnis so aus.

    Code:
    BundleName
    |--ContaonManager
    |-- Resources
    |-- composer.json
    |-- BundleName.php
    das sieht falsch aus oder?
    Grüße
    Alex

  26. #26
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.175
    Partner-ID
    10107

    Standard

    Ja, weil du
    Code:
      "repositories": [
        {
          "type": "path",
          "url": "src/Vendor/NameBundle"
        }
      ],
    benutzt. Das ist für den Fall vorgesehen, wenn du ein Repository, dass sich irgendwo lokal befindet, in das Projekt symlinken willst. Composer erzeugt dann einen entsprechenden Symlink im vendor/ Ordner.

  27. #27
    Contao-Fan
    Registriert seit
    16.11.2012.
    Ort
    Freiburg
    Beiträge
    539

    Standard

    Konnte das Problem lösen.

    Die Verzeichnisstruktur sieht bei mir jetzt so aus

    Code:
    ROOT
    |-- Vendor
       |-- Bundle
          |-- src
             |-- Verzeichnisse
             |-- Bundle.php
          |-- composer.json
    Grüße
    Alex

  28. #28
    Contao-Nutzer
    Registriert seit
    13.03.2018.
    Beiträge
    16

    Standard ME Bundle manuell einbinden

    Hello,

    sorry für die evtl. schon gestellte oder doofe Frage. Aber wie könnte ich jetzt in der ME ein erstelltes Bundle einbinden?

    Meine Struktur sieht folgendermaßen aus

    HTML-Code:
    [Contao:ROOT]/vendor/[MyVendor] -> ../_external/[MyVendor]
    [Contao:ROOT]/_external/[MyVendor]/[MyBundle]
    |---- /composer.json
    |---- /src/
    |---- /src/[...]
    Meine composer.json sieht folgendermaßen aus:

    HTML-Code:
    {
      "name": "[MyVendor]/[MyBundle]",
      "type": "contao-bundle",
      "description": "[...]",
      "keywords": [...],
      "homepage": "[...]",
      "license": "LGPL-3.0-or-later",
      "authors": [
        {
          [...]
        }
      ],
      "support": {
        "email": "[E-Mail]"
      },
      "require": {
        "php":">=7.0",
        "contao/core-bundle": "^4.0"
      },
      "require-dev": {
        "php":">=7.0",
        "contao/core-bundle": "^4.0"
      },
      "autoload": {
        "psr-4": {
          "[MyVendor]\\[MyBundle]\\": "src/"
        },
        "classmap": [
          "src/Resources/contao/"
        ],
        "exclude-from-classmap": [
          "src/Resources/contao/config/",
          "src/Resources/contao/dca/",
          "src/Resources/contao/languages/",
          "src/Resources/contao/templates/"
        ]
      },
      "extra":{
        "contao-manager-plugin": "[MyVendor]\\[MyBundle]\\ContaoManager\\Plugin"
      }
    }
    Vielen Dank für die Hilfe und evtl. sorry für doof
    Lukas

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •