Ankündigung

Einklappen
Keine Ankündigung bisher.

Doctrine2 und phpmailer

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Doctrine2 und phpmailer

    Hallo,

    habe in meinem Projekt den phpmailer via composer installert.

    meine compose.json

    Code:
    {
        "autoload": {
            "psr-0": {
                "Controllers": "./src/",
                "Entities": "./src/",
                "Repositories": "./src/",
                "Validators": "./src/"
            }
        },
        "require": {
            "php": ">=5.3.2",
            "doctrine/orm": "2.4.4",
            "gedmo/doctrine-extensions": "2.3.9",
            "webmasters/doctrine-extensions": "3.0.0",
            "ezyang/htmlpurifier": "4.6.0",
            "ircmaxell/password-compat": "1.0.3",
            "ircmaxell/random-lib": "1.0.0",
            "phpmailer/phpmailer": "dev-master"
        }
    }
    Mein KontaktController.php sieht folgendermaßen aus:

    PHP-Code:
    namespace Controllers;

    use \
    PHPMailer;  //Hier bleibt der Code irgendwie ohne Fehlermeldung hängen.

    class KontaktController extends AbstractSecurity {

       public function 
    mailAction() {
          
    $this->setTemplate('kontaktAction');
       }

       public function 
    sendenAction() {
          
    $mail = new PHPMailer;

       }


    Hat jemand eine Idee?
    oder wiß jemand wie ich den phpmailer einbinde.?

    mit vielem Dank im Vorraus

    Andreas Jacobi

  • #2
    Wenn du PSR-0 Autoloading nutzt, dann wird das Namespace direkt in die Verzeichnisstruktur aufgelöst.
    Dadurch dass du \PHPMailer nutzt, bist du in der obersten Namespace-Ebene. Dort kann Composer die Klasse nicht finden (außer du hättest das explizit definiert), da die Klasse in vendors liegen müsste.
    "Software is like Sex, it's best if it's free." - Linus Torvalds

    Kommentar


    • #3
      die class.phpmailer.php liegt in vendor/phpmailer/phpmailer.
      wi muß der Eintrag in der compose.json lauten?

      Kommentar


      • #4
        Hallo,


        das passt soweit. Außerdem heißt die composer.json. Ich dachte das sei erst nur ein Tippfehler, aber da es zwei mal so falsch geschrieben wurde, möchte ich darauf hinweisen.

        Das Problem ist, dass weder PHPMailer noch der SwiftMailer einem Standard folgt. PHPMailer hat in deinem Fall classmaps dafür definiert. Versuche deswegen den Backslash beim use Statement einfach mal weg zu lassen. Theoretisch bräuchtest du das use Statement gar nicht, weil es eh im globalen Namespace ist. Also einfach
        PHP-Code:
        $mailer = new PHPMailer(); 
        sollte ohne Problem klappen.
        Wenn du einen Debugger hast, dann debugge dich einfach mal bis zum composer autoload vom use Statement rein, dann siehst du genau, was composer für ein classmap array zum auflösen hat. Wenn du da drin bist, das große array aufklappen und dann sieht man, was Composer auflösen kann.

        Kommentar


        • #5
          Danke funktioniert jetzt.
          Ich mache schreibfehler schon mal doppelt.
          $mail->send() verzeiht nicht alle konfigurationsfehler und hängt sich dann auf.

          Kommentar


          • #6
            Zitat von AndreasJ Beitrag anzeigen
            $mail->send() verzeiht nicht alle konfigurationsfehler und hängt sich dann auf.
            Was auch immer und hängt sich dann auf bedeutet.
            Schau dir das mal an: https://php-de.github.io/jumpto/leitfaden/

            Hier noch ein paar zufällige Einwürfe, die du nach belieben weiter recherchieren oder einfach ignorieren kannst:

            PHP-Code:
            extends AbstractSecurity 
            PHP-Code:
            $this->setTemplate('kontaktAction'); 
            Ja, das ist so von vielen "Profi"-Frameworks vorgelebt. Extends beschreibt eine ist-ein-Beziehung. Controller sind kein (Abstract)Security.

            Controller sollten auch nicht von irgendwas ableiten. Und sie sollten auch nie das new-Schlüsselwort verwenden. Sie sollten weitesgehend mit Delegation arbeiten. Das ist gerade bei kleineren Projekten häufig unnötiger overhead, weswegen das in jedem Projekt neu überdacht werden kann. Ich mache das immer so, weil ich häufig auch Testdriven entwickle. - In dem Fall möchtest du nicht explizit mit dem PHPMailer arbeiten, sondern mit einem Mailer, der dann beispielsweise der PHP-Mailer sein kann:

            PHP-Code:
            <?php
            namespace Controllers;

            use 
            PHPMailer;

            class 
            KontaktController {
                
            /** @var Mailer */
                
            private $mailer;
                
            /** @var Template */
                
            private $template;

                
            /**
                 * @param Mailer $mailer
                 * @param Template $template
                 */
                
            public function __construct(Mailer $mailerTemplate $template) {
                    
            $this->mailer $mailer;
                    
            $this->template $template;
                }

                public function 
            mailAction() {
                    
            $this->template->setTemplate('kontaktAction');
                }

                public function 
            sendenAction() {
                    
            $this->mailer->send(
                        
            $this->mailer->create()
                        ->
            setFrom('test@example.org''Max Mustermann')
                        ->
            setSubject('Test')
                        ->
            setBody('Dies ist ein Test''text/html')
                        ->
            addRecipient('test@example.org')
                    );
                }
            }
            Wenn sich das Thema interessiert:
            - http://php-di.org/
            - https://code.tutsplus.com/tutorials/...php--net-26186

            Diese Videoreihe soll sehr interessant sein. Als Projekt hält Magento 2 her. Aber das ist nicht so wichtig für die eigentliche Idee:
            - https://www.youtube.com/c/Mage2Katas

            Ich habe sie selbst noch nicht geschaut!

            Kommentar


            • #7
              Zitat von derwunner Beitrag anzeigen
              Versuche deswegen den Backslash beim use Statement einfach mal weg zu lassen.
              Der Leading-Backslash im use-Statement hat keinerlei Auswirkungen. Für gewöhnlich lässt man ihn dort aber weg.

              Zitat von derwunner Beitrag anzeigen
              Theoretisch bräuchtest du das use Statement gar nicht, weil es eh im globalen Namespace ist.
              Mööp. Sobald du dich im Kontext eines eigenen Namespaces befindest, ist das use-Statement (oder Alternativ der Leading-Backslash im Code) pflicht. Ansonsten versucht PHP den Klassennamen relativ zum aktuellen Namespace aufzulösen. Beispiel:

              PHP-Code:
              <?php
              namespace app;

              use 
              DateTime as DateTimeAlias;

              $date = new \DateTime;            // built-in DateTime (OK!)
              $date = new DateTimeAlias;    // built-in DateTime via alias (OK!)

              $date = new DateTime;        // app\DateTime (FATAL ERROR! Class not found..)
              [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

              Kommentar

              Lädt...
              X