[Frage] Extbase Validator im eigenen Validator nutzen [Gelöst]

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    12. 12. 2013, 15:46

    Ich hätte noch zwei Fragen zum Thema "Validierung" in extbase (Typo3 6.2 beta2):

    1. Kann man in einem eigenen Validator (einen komplexen Domänen-Validator, der das ganze Objekt prüft) eigentlich auch auf die extbase-Validatoren zugreifen, um z.B. eine E-Mail-Adresse zu prüfen o.ä.?
    Meinem Validator vom E-Mail-Adressen-Validator erben zu lassen wäre keine Option, da ich beispielsweise noch den Datums-Validator von Extbase bräuchte und man in PHP ja nur von einer Klasse erben kann. Es sollte doch also eine Möglichkeit geben, auf die einzelnen Validatoren von extbase zugreifen zu können oder sehe ich das falsch?

    2. Kann man eigentlich auch innerhalb einer Controller-Action einen Validator aufrufen? Ich finde es unpraktisch, dass die Validierung nur bei Formularen greift. Wenn ich z.B. Daten als CSV, XML o.ä. geliefert bekomme, die ich in der Datenbank speichern muss, wäre es praktisch, wenn ich diese Daten innerhalb meiner Action auf Validität prüfen könnte, bevor ich die Objekte persistiere.

    Ich hoffe, dass ihr mir etwas Licht in die dunklen Tiefen von exbase bringen könnt :-)
    Danke schon mal für eure Hilfe!

  • 99grad 99grad
    T3PO
    1 x
    19 Beiträge
    1 Hilfreiche Beiträge
    10. 10. 2014, 01:53 - Lösung

    Da jeder Validator die Funktionen validate() und getErrors() des AbstractValidators erbt, kannst Du den Validator trotzdem nutzen:

    1. $email = 'johnXXmelone.com'; // falsche E-Mail
    2. $validator = $this->objectManager->create('\TYPO3\CMS\Extbase\Validation\Validator\EmailAddressValidator');
    3. print_r( $validator->validate($email)->getErrors() );

    getErrors() liefert entweder ein leeres Array zurück - oder eine Liste der Fehlermeldungen.
    Weitere Infos auch in unserem Labor [url]http://labor.99grad.de/?p=866[/url]


  • 1
  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    18. 12. 2013, 09:01

    Weiß auf diese Frage wirklich keiner eine Antwort oder ist die Lösung so offensichtlich, dass sie niemand schreiben will? :-)
    Es muss doch für dieses Problem eine einfache Lösung geben... Normalerweise würde ich so eine Klasse ja einfach mit new initialisieren, aber da der Zugriff auf manche Klassen in Extbase gefühlt kompliziert über 5 Ecken funktioniert, ist mir nicht ganz klar, wie man die Klassen einsetzen kann (außerhalb des "normalen Weges"). Die Suchmaschine gab mir leider auch keine brauchbare Antwort.

    Gibt es eigentlich irgendwo eine Anleitung, wie man verschiedene Klassen in Extbase einbinden bzw. nutzen kann (z.B. über inject, static, new, ...)? Vielleicht würde mir so etwas schon weiter helfen, um herauszufinden, wie ich die Validator-Klassen selbst an beliebigen Stellen nutzen kann. Ich habe zwar das Buch "Typo3-Extensions mit Extbase & Fluid" durchgearbeitet, aber dort wurde auch immer nur der Standard-Weg erklärt. Für mich sind immer noch Fragen offen, wie z.B.: Funktioniert die Einbindung einer Klasse über inject eigentlich in jeder Klasse (egal ob Controller, Validator, Repository o.ä.) oder müssen dafür bestimmte Bedinungen erfüllt sein?

  • kitsunet kitsunet
    Flash Gordon
    0 x
    2559 Beiträge
    27 Hilfreiche Beiträge
    18. 12. 2013, 09:52

    Hol dir so einen Validator aus dem ObjectManager (das wäre der schöne Weg) oder erzeug ihn einfach mit new. Sollte bei den Validatoren kein Problem sein.

    config.baseURL = http://www.kitsunet.com/
    TYPO3 Flow und Neos Community Contact
    Release Manager TYPO3 Neos 1.1
    Ich habe Probleme mit den PMs hier, also schreibt mir bitte eine Mail oder über Twitter!

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    20. 12. 2013, 09:15

    Wie bindet man den objectManager im Validator ein? (Das ist der Punkt den ich meinte mit "Gibt es eigentlich irgendwo eine Anleitung, wie man verschiedene Klassen in Extbase [an beliebigen Stellen]einbinden bzw. nutzen kann?").
    Ich habe mich zum Testen des Vorschlags mit dem objectManager an der Vorgehensweise hier orientiert:
    http://forge.typo3.org/projects/typo3v4-mvc/wiki/Dependency_Injection_(DI)

    Mein Validatior-Code sieht also nun so aus:

    [code]<?php
    namespace XY\Newsletter\Domain\Validator;

    class RequestValidator extends \TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator {

    /**
    * @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface
    * @inject
    */
    protected $objectManager;

    /**
    * action isValid
    *
    * @param \XY\Newsletter\Domain\Model\Newsletter $newsletter
    * @return void
    * @api
    */
    public function isValid($newsletter) {
    $emailValidator = $this->objectManager->create('\TYPO3\CMS\Extbase\Validation\Validator\EmailAddressValidator');
    ...
    }
    }
    ?>
    [/code]

    Das Resultat ist ein Fatal error: Call to a member function create() on a non-object

    Also entweder kann man in einen Validator nichts "injecten" oder ich mache bei der Anwendung einen Fehler, den ich noch nicht verstehe. Der objectManager scheint laut Fehlermeldung zumindest nicht als Objekt in meinem Valdator zu existieren. Hat jemand einen Tipp für mich?

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    20. 12. 2013, 09:33

    Ok, also mit "new \TYPO3\CMS\Extbase\Validation\Validator\EmailAddressValidator" funktioniert zumindest das Einbinden des E-Mail-Validators von Extbase.
    Da mir dessen Funktion "isValid" aber keinen boolschen Wert zurück liefert, sondern nur eine Fehlermeldung erstellt, macht der Aufruf der Funktion in meinem eigenen Validator keinen Sinn.
    Die Funktion "validEmail" des E-Mail-Validators liefert zwar einen boolschen Wert (und wäre damit genau das, was ich brauche), aber da sie protected ist, kann ich sie nicht von meinem Validator aus aufrufen.
    Von der Validator-Klasse erben macht keinen Sinn, weil ich ja eine Lösung suche, bei der ich auf verschiedene Validatoren von Extbase zugreifen kann.

    [b]Das Ende vom Lied: ich greife jetzt in meiner Validator-Klasse direkt auf[/b]
    [b]\TYPO3\CMS\Core\Utility\GeneralUtility::validEmail() zu und erhalte - wie gewünscht - als Ergebnis einen boolschen Wert.[/b]
    Gehört das noch in die Kategorie "saubere Programmierung nach der Philosophie bei Extbase" oder sollte man das doch anders lösen? (Ich weiß: ein Richtig oder Falsch gibt es vermutlich nicht, aber es gibt ja zumindest Empfehlungen, wie man etwas umsetzen sollte, damit es auch in zukünftigen Extbase-Versionen noch funktioniert etc. :))

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    20. 12. 2013, 14:14

    - Eintrag gelöscht -
    (nach Update auf Typo3 6.2 beta3 funktionierte plötzlich alles - auch das Einbinden von Repositories o.ä. via inject in den Validator ...)

  • 99grad 99grad
    T3PO
    1 x
    19 Beiträge
    1 Hilfreiche Beiträge
    10. 10. 2014, 01:53

    Da jeder Validator die Funktionen validate() und getErrors() des AbstractValidators erbt, kannst Du den Validator trotzdem nutzen:

    1. $email = 'johnXXmelone.com'; // falsche E-Mail
    2. $validator = $this->objectManager->create('\TYPO3\CMS\Extbase\Validation\Validator\EmailAddressValidator');
    3. print_r( $validator->validate($email)->getErrors() );

    getErrors() liefert entweder ein leeres Array zurück - oder eine Liste der Fehlermeldungen.
    Weitere Infos auch in unserem Labor [url]http://labor.99grad.de/?p=866[/url]

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    10. 10. 2014, 21:36

    Na der Artikel in eurem "Labor" hätte ruhig mal früher kommen können *lach* ;-)
    Sieht auf jeden Fall nach einer saubereren Lösung aus als meine! Vielen Dank für den Tipp :-)

  • 1