Ergebnis 1 bis 9 von 9

Thema: config/config.yaml

  1. #1
    Contao-Nutzer
    Registriert seit
    10.10.2013.
    Beiträge
    52

    Standard config/config.yaml

    Ich möchte für ein Bundle eine eigene Konfiguration definieren. Im Bundle-Ordner habe ich eine config/config.yaml mit einem parameters: Bereich angelegt.

    Code:
    parameters:
        para1: 'xyz'
        para2: 'abc'
    Code:
    $this->Config
    gibt die Werte meiner config.yaml aber nicht aus.

    Nach langem Suchen habe ich (finde ich) eine recht aufwändige Grundvariante für Symfonie allgemein gefunden https://stackoverflow.com/questions/...ile-for-bundle.

    Wie bekomme ich die Parameter am einfachsten und saubersten in mein Bundle? Ist das wirklich so aufwändig?

  2. #2
    Alter Contao-Hase
    Registriert seit
    24.02.2021.
    Beiträge
    1.477
    Partner-ID
    11715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von 462 Beitrag anzeigen
    Wie bekomme ich die Parameter am einfachsten und saubersten in mein Bundle? Ist das wirklich so aufwändig?
    Genau so, wie in deinem Beispiel.

    Oder du nutzt ENV

  3. #3
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.580
    User beschenken
    Wunschliste

    Standard

    Das twitter Beispiel aus Stack Overflow kam mir bekannt vor. Hab's in meiner Sammlung gefunden: https://symfony.com/doc/current/bund...iguration.html
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  4. #4
    Contao-Nutzer
    Registriert seit
    10.10.2013.
    Beiträge
    52

    Standard

    Vielen Dank für die Hinweise. Leider muss man sich die Informationen über die verschiedenen Symfony Versionen und die Abwandlungen durch Contao etwas zusammensuchen. Aktuell funktioniert es für mich am Besten in der nachfolgenden Art und Weise.

    1. Einlesen der config/config.yaml (und einer config/service.yaml) ins Bundle entsprechend der Entwickler-Doku (https://docs.contao.org/dev/getting-...-configuration). Mit erster Import-Zeile wird die Konfigurationsdatei bereits in den Applikations-Container eingelesen.

    PHP-Code:
    <?php
    // scr/MyAppNameBundle.php

    declare(strict_types=1);

    namespace 
    IAmVendor\MyAppName;

    use 
    Symfony\Component\HttpKernel\Bundle\AbstractBundle;
    use 
    Symfony\Component\DependencyInjection\ContainerBuilder;
    use 
    Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

    class 
    MyAppNameBundle extends AbstractBundle
    {
      public function 
    loadExtension(array $configContainerConfigurator $containerContainerBuilder $builder): void
      
    {
          
    $container->import('../config/config.yaml');
          
    $container->import('../config/services.yaml');
        }
    }
    Leider ist jedoch der Zugriff auf den Container in den Contao-Klassen wohl nicht ohne weiteres gegeben, wenn man zum Beispiel aus den Callbacks der dca-Konfigurationen darauf zugreifen möchte (https://community.contao.org/de/show...l=1#post533196). Die in den Symfony-Beispielen angegebenen Verfahren mit einer Dependency-Injection in die jeweilige Klasse funktioniert also so nicht direkt.

    2. Die Alternative, die bleibt, ist eben einen eigene Klasse (für eine Dependency-Injection) beziehungsweise direkte einen Service zu erstellen, der die Parameter intern bereitstellt. Damit eine derartige Klasse als Service eben allgemein und universell (und sogar einmalig) bereitgestellt wird, ist die oben angegebene config/service.yaml erforderlich.
    Cool sind hierbei die beim aktuellen Symfony bereitgestellten Attribute zur Verknüpfung der Parameter (https://symfony.com/doc/current/serv...utowiring.html), die einen speziellen Zugriff auf den $parameterBag des Containers stark vereinfachen.

    PHP-Code:
    <?php
    // scr/Constant.php

    declare(strict_types=1);

    namespace 
    IAmVendor\MyAppName;

    use 
    Symfony\Component\DependencyInjection\Attribute\Autowire;

    class 
    Constant
    {
        public function 
    __construct(
            
    #[Autowire(param: 'para1')]
            
    protected string $para1,

            
    #[Autowire(param: 'para2')]
            
    protected string $para2,
        ) {
        }

        public function 
    __get($property) {
          if (
    property_exists($this$property)) {
            return 
    $this->$property;
          }
        }
    }
    3. Nun kann dieser "Constant"-Service in einer abgeleiteten Contao-Klasse verwendet werden.
    PHP-Code:
    <?php
    //contao/dca/tl_...

    declare(strict_types=1);

    use 
    Contao\System;

    ...

    class 
    tl_... extends Contao\Backend {

        public function 
    __construct(private string $param1) {   
          
    $constant System::getContainer()->get('IAmVendor\MyAppName\Constant');
          
    $this->param1 $constant->$param1;
        }
    }
    Geändert von 462 (06.11.2024 um 15:22 Uhr)

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

    Standard

    Das brauchst du nicht, du kannst auch einfach
    PHP-Code:
    System::getContainer()->getParameter(
    in solchen Legacy Klassen nutzen.
    » sponsor me via GitHub or Revolut

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

    Standard

    Zitat Zitat von 462 Beitrag anzeigen
    Leider ist jedoch der Zugriff auf den Container in den Contao-Klassen wohl nicht ohne weiteres gegeben, wenn man zum Beispiel aus den Callbacks der dca-Konfigurationen darauf zugreifen möchte
    Für Callbacks kannst du auch DI verwenden. Siehe https://docs.contao.org/dev/framewor...ring-callbacks
    » sponsor me via GitHub or Revolut

  7. #7
    Contao-Nutzer
    Registriert seit
    10.10.2013.
    Beiträge
    52

    Standard

    Also bin ich doch noch etwas mehr von hinten durch die Brust ins Auge unterwegs gewesen, als notwendig war. Für den Lerneffekt aber ganz gut.

    Hat die Einbindung der Callbacks per Attribut eigentlich noch mehr Vorteile außer die Möglichkeit der Dependency-Injection und dass ich vielleicht näher am originären Symfony selbst bin?
    Ich verteile doch zusammengehörige Funktionalitäten auf verschiedene Dateien, was die Übersicht nach meinem Empfinden nicht wirklich fördert.

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

    Standard

    Zitat Zitat von 462 Beitrag anzeigen
    Hat die Einbindung der Callbacks per Attribut eigentlich noch mehr Vorteile außer die Möglichkeit der Dependency-Injection und dass ich vielleicht näher am originären Symfony selbst bin?
    Sauberes programmieren zB
    » sponsor me via GitHub or Revolut

  9. #9
    Contao-Nutzer
    Registriert seit
    10.10.2013.
    Beiträge
    52

    Standard

    Ich habe gerade zwei Attribut-Definitionen (#[AsHook('...')] und #[Autowire(param: 'para1')]) für einen Hook-Service kombiniert, was, wie ich finde, schon eine echt elegante Lösung darstellt. So wird auch die Ausgliederung der Klassen beispielsweise für die Callbacks aus den dca-Definitionsdateien wirklich richtig sinnvoll.

    PHP-Code:
    ...
    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
    use 
    Symfony\Component\DependencyInjection\Attribute\Autowire;

    #[AsHook('XXX')]
    class XXXListener
    {   
        public function 
    __construct(
            
    #[Autowire(param: 'param1')]
            
    protected string $param1
            
    ) {
            }

        public function 
    __invoke() {
            
    $x $this->param1;
            ...
        }


Aktive Benutzer

Aktive Benutzer

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

Berechtigungen

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