Ergebnis 1 bis 21 von 21

Thema: Hooks registrieren & Testen

  1. #1
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Trauriges Gesicht Hooks registrieren & Testen

    Hallo zusammen,

    ich versuche gerade, einen einfachen Hook einzubinden, um zu überprüfen ob eine im Formularfeld eingetragene E-Mail in einer DB-Tabelle vorhanden ist und wenn nicht, einen Fehler am Formularfeld auszugeben.

    Dazu habe ich ein Formular mit der formID "akteurTest" mit dem Feld "email" angelegt.

    Dann habe ich eine src/EventListener/checkAkteur.php nach der validateFormField Referenz angelegt:
    Code:
    <?php
    
    namespace App\EventListener;
    
    use Contao\Database;
    
    #[AsHook('validateFormField')]
    class CheckAkteur{
        public function __invoke(Widget $widget, string $formId, array $formData, Form $form): Widget
            {
                if ('akteurTest' === $formId && 'email' === $widget->name) {
                    // Do your custom validation and add an error if widget does not validate
                    $widget->addError('My custom widget error');
                }
    
                return $widget;
            }
    }
    Jetzt bin ich mir nicht sicher, was ich falsch mache, aber mein Error wird nicht ausgegeben. Ich habe Cache gelöscht und die Composer install durchlaufen lassen und nichts...

    Kann ich irgendwo einsehen, ob der Hook richtig registriert wurde oder ob es an der Funktion liegt?

    Generell wenn ich Hooks registrieren möchte, weiß ich nicht ganz, wie ich sicherstelle ob sie überhaupt erkannt werden.

    Ich bin dankbar für jeden Tipp

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

    Standard

    Zitat Zitat von FlorinvV Beitrag anzeigen
    Generell wenn ich Hooks registrieren möchte, weiß ich nicht ganz, wie ich sicherstelle ob sie überhaupt erkannt werden.
    Mit debug:container kannst du das prüfen. Also bspw.
    Code:
    vendor/bin/contao-console debug:container CheckAkteur
    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    Danke Spooky, das hilft schonmal sehr

    Offenbar hat tatsächlich in der Registrierung etwas nicht funktioniert, da er mit den Fehler auswirft:
    Code:
    No services found that match "CheckAkteurEmail".
    Wenn du dir meinen Aufbau anschaust, fällt dir da auf, was da nicht richtig eingerichtet ist? Habe ich das Attribute falsch gesetzt oder so?

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

    Standard

    Ist es nun CheckAkteurEmail oder CheckAkteur? Poste nochmal deinen exakten Code und den exakten Pfad deiner Datei.
    » sponsor me via GitHub or Revolut

  5. #5
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    Ich hatte zwischendurch den Namen etwas angepasst, hab aber den Cache nochmal gelöscht bevor ich es getestet habe

    Pfad: root/src/EventListener/checkAkteurEmail.php
    Code:
    Code:
    <?php
    
    namespace App\EventListener;
    
    use Contao\Database;
    
    #[AsHook('validateFormField')]
    class CheckAkteurEmail {
        public function __invoke(Widget $widget, string $formId, array $formData, Form $form): Widget
            {
                if ('akteurEdit' === $formId && 'email' === $widget->name) {
                    $widget->addError('My custom widget error');
                }
    
                return $widget;
            }
    }

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

    Standard

    In deiner PHP Datei hast du nun die Klasse CheckAkteurEmail definiert. Der Pfad deiner Datei lautet jedoch src/EventListener/checkAkteurEmail.php. Du musst entweder den Klassennamen entsprechend ändern oder den Dateinamen. Üblicherweise nutzt man für Klassennamen PascalCase, also CheckAkteurEmail.
    » sponsor me via GitHub or Revolut

  7. #7
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    Ja, sein eigenes Zeug lesen muss man können

    Leider wird er immer noch nicht erkannt...

    Muss ich Cachemäßig noch etwas beachten?

    Ich mache normalerweise composer install und leere den Prod Cache.

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

    Standard

    composer install reicht.

    Poste deinen aktuellen Code, den Pfad zur Datei und deine config/services.yaml, wenn du eine hast.
    » sponsor me via GitHub or Revolut

  9. #9
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    Pfad: src/EventListener/CheckAkteurEmail.php
    Code:
    Code:
    <?php
    
    namespace App\EventListener;
    
    use Contao\Database;
    
    #[AsHook('validateFormField')]
    class CheckAkteurEmail {
        public function __invoke(Widget $widget, string $formId, array $formData, Form $form): Widget
            {
                if ('akteurEdit' === $formId && 'email' === $widget->name) {
                    $widget->addError('My custom widget error');
                }
    
                return $widget;
            }
    }
    eine services.yaml habe ich keine

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.231
    Partner-ID
    10107
    » sponsor me via GitHub or Revolut

  11. #11
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    Ich habe die statements reingepackt, gleiches Ergebnis:

    Code:
    <?php
    
    namespace App\EventListener;
    
    use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
    use Contao\Form;
    use Contao\Widget;
    use Contao\Database;
    
    #[AsHook('validateFormField')]
    class CheckAkteurEmail {
        public function __invoke(Widget $widget, string $formId, array $formData, Form $form): Widget
            {
                if ('akteurEdit' === $formId && 'email' === $widget->name) {
                    $widget->addError('My custom widget error');
                }
    
                return $widget;
            }
    }

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

    Standard

    Welche Contao und PHP Version? Was ist die Ausgabe von vendor/bin/contao-console debug:container CheckAkteurEmail?
    » sponsor me via GitHub or Revolut

  13. #13
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    Contao: 4.13.50
    PHP: 8.3.14

    debug:container:
    Code:
    14:37:54 CRITICAL  [console] Error thrown while running command "debug:container CheckAkteurEmail". Message: "No services found that match "CheckAkteurEmail"." ["exception" => Symfony\Component\Console\Exception\InvalidArgumentException^ { …},"command" => "debug:container CheckAkteurEmail","message" => "No services found that match "CheckAkteurEmail"."]

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

    Standard

    Also bei mir funktioniert dein Code:
    Code:
    debug:container CheckAkteurEmail
    
    Information for Service "App\EventListener\CheckAkteurEmail"
    ============================================================
    
     ---------------- -------------------------------------------------------------
      Option           Value
     ---------------- -------------------------------------------------------------
      Service ID       App\EventListener\CheckAkteurEmail
      Class            App\EventListener\CheckAkteurEmail
      Tags             contao.hook (hook: validateFormField, method: , priority: )
      Public           yes
      Synthetic        no
      Lazy             no
      Shared           yes
      Abstract         no
      Autowired        yes
      Autoconfigured   yes
     ---------------- -------------------------------------------------------------
    Irgendein Detail muss bei dir also noch anders sein. Poste mal einen Screenshot der Dateistruktur deiner Contao Installation, mit den Ordnern contao/, config/ und src/ offen.
    » sponsor me via GitHub or Revolut

  15. #15
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    So sieht die Installation aus:
    Bildschirmfoto 2024-12-13 um 14.45.00.png

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

    Standard

    Du hast noch einige andere Dateien in deinem src/ Verzeichnis. Was ist die Ausgabe von
    Code:
    vendor/bin/contao-console debug:container "App\"
    ? Poste außerdem deine composer.json.
    » sponsor me via GitHub or Revolut

  17. #17
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    Wenn ich
    Code:
    vendor/bin/contao-console debug:container "App\"
    ausführe, passiert gar nichts... ich glaube da verrennt sich etwas..

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

    Standard

    Versuche es mit
    Code:
    vendor/bin/contao-console debug:container "App\\"
    // edit: sorry, irrtümlich deinen Post editiert statt zitiert
    » sponsor me via GitHub or Revolut

  19. #19
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    Passiert

    Leider auch Fehlanzeige:

    Code:
    $ vendor/bin/contao-console debug:container "App\\"
    15:21:05 CRITICAL  [console] Error thrown while running command "debug:container 'App\'". Message: "No services found that match "App\"." ["exception" => Symfony\Component\Console\Exception\InvalidArgumentException^ { …},"command" => "debug:container 'App\'","message" => "No services found that match "App\"."]

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

    Standard

    Dein anderer Code in src/ verhindert vermutlich die automatische Service Registrierung. Erzeuge die Datei config/services.yaml mit folgendem Inhalt:
    PHP-Code:
    # config/services.yaml
    services:
        
    _defaults:
            
    autowiretrue
            autoconfigure
    true

        App
    \:
            
    resource: ../src
            exclude
    : ../src/{Widget
    Danach composer install und vendor/bin/contao-console debug:container "App\\"
    » sponsor me via GitHub or Revolut

  21. #21
    Contao-Nutzer
    Registriert seit
    06.04.2020.
    Beiträge
    144

    Standard

    Puh, mit der services.yaml tut's jetzt und auch das CheckAkteurEmail wird jetzt erkannt.

    Danke dir und auch für deine Geduld

    Trotzdem wird wohl ein großes Projekt Anfang nächstes Jahr die ganzen Dateien mal neu aufzubauen, dass es auch ohne services.yaml tut... muss ja sowieso endlich mal alles für die 5. vorbereiten

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
  •