Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Autoloader fügt die Klasse nicht hinzu

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Autoloader fügt die Klasse nicht hinzu

    Guten Tag liebe Community.
    Ich habe derzeit ein kleines Problem, womit ich gerade nicht wirklich weiter komme. Ich habe einen Autoloader, der mir selbstverständlich durch die Namespaces die Klassen inkludiert.

    Nun zu meinem Problem... Mein Code sieht derzeit so aus:
    PHP-Code:
        if(isset($get[0])) {
          
    $controller sprintf("\\Daily\\Application\\Controllers\\%sController"ucfirst($get[0]));

          if(!
    class_exists($controller)) {
            echo 
    sprintf("Class %s not Found"$get[0].'Controller');
          }

          
    $controller = new $controller;

          if(!
    mthod_exists($controller'Main')) {
            echo 
    'Methode "Main" wurde nicht gefunden!';
          }

          
    $controller->Main();
        } 
    Ich habe mal über dem Autoloader das ganze ausgeben lassen und irgendwie ist der Pfad zwar richtig, aber die Datei wird nicht inkludiert:
    PHP-Code:
    <?php
    namespace Daily;
    /**
    |-----------------------------------
    |       DailyCMS - Autoloader
    |-----------------------------------
    **/

    spl_autoload_register(function($className) {
      echo 
    implode('/'array_slice(explode('\\'$className), 1)) . '.php <br />';
      @include 
    implode('/'array_slice(explode('\\'$className), 1)) . '.php';
    });
    Ergebnis:


    Es ist doch eig. alles richtig, oder nicht?
    MfG.


  • #2
    http://php.net/manual/de/function.file-exists.php ?
    GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

    Kommentar


    • #3
      Jo, oder man lässt einfach das @ vor dem include weg, dann wirft's sowieso nen Fehler wenn's die Datei nicht gibt.

      Kommentar


      • #4
        Hab meinen Code überarbeitet:
        PHP-Code:
            if(isset($get[0])) {
              if(
        file_exists('application/controllers/'.ucfirst($get[0]).'Controller.php')) {
                
        $controller sprintf("\\Daily\\Application\\Controllers\\%sController"ucfirst($get[0]));

                if(!
        class_exists($controller)) {
                  echo 
        sprintf("Class %s not Found"$get[0].'Controller');
                }

                
        $controller = new $controller;

                if(!
        mthod_exists($controller'Main')) {
                  echo 
        'Methode "Main" wurde nicht gefunden!';
                }

                
        $controller->Main();
              } else {
                echo 
        "File not found";
              }
            } 
        Datei existiert, aber die Klasse nicht. Kann gar nicht sein....
        @Tropi: Hab mal das @ vorm include weg gemacht:
        PHP-Code:
        <?php
        namespace Daily;
        /**
        |-----------------------------------
        |       DailyCMS - Autoloader
        |-----------------------------------
        **/

        spl_autoload_register(function($className) {
          echo 
        implode('/'array_slice(explode('\\'$className), 1)) . '.php <br />';
          include_once 
        implode('/'array_slice(explode('\\'$className), 1)) . '.php';
        });
        bekomme ebenfalls den gleichen Fehler:
        Fatal error: Class '\Daily\Application\Controllers\TestController' not found in /Applications/XAMPP/xamppfiles/htdocs/System/Routing.php on line 26
        MfG.

        Kommentar


        • #5
          http://seld.be/notes/psr-4-autoloadi...rt-in-composer
          Standards - Best Practices - AwesomePHP - Guideline für WebApps

          Kommentar


          • #6
            Ich werde nicht den Autoloader von Composer benutzen. ._.
            MfG.

            #EDIT - Danke für Eure Hilfe! Ich habe das Problem behoben, ich habe in meinen Namespaces vergessen "Controllers" dahinter einzufügen!

            Kommentar


            • #7
              Hast du dir mal den Pfad genau angeschaut?
              Der Anfang macht den Unterschied! Betrachte mal deinen Pfad nachdem du dich über relative und Absolute Pfadangaben informiert hast.
              mysql ist veraltet Mails senden: Ohne Probleme und ohne mail()
              PHP-Code:
              echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>'

              Kommentar


              • #8
                Btw. einen Ordnernamen "Controllers" halte ich für nicht optimal. Ich bin der Meinung, das ist stets in der Einzahl zu halten, solange die Bezeichnung auch keine Kategorie ist.

                Wenn du z.B. mehrere Typen in diesem Ordner hast (so wie bei Ressourcen: views, images, stylesheets, ...), dann ist eine Mehrzahl angebracht.
                GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                Kommentar


                • #9
                  Zitat von xkl01l Beitrag anzeigen
                  Ich werde nicht den Autoloader von Composer benutzen.
                  Ich habe es einfach mal so reingeworfen. Bei einem so klaren Statement würde mich der Grund dann schon interessieren!?
                  Standards - Best Practices - AwesomePHP - Guideline für WebApps

                  Kommentar


                  • #10
                    Mich auch. Denn das ist super einfach, mit PSR-4-Autoloading. Mal ganz schnell:
                    - composer.phar ins Projektverzeichnis kopieren
                    - composer.json anlegen
                    - PSR-4 Eintrag hinzufügen - das hier sollte schon reichen:
                    Code:
                    {
                    	"autoload": {
                                "psr-4": {
                                    "Namensraum\\": "pfad/dort/hin"
                                }
                    	}
                    }
                    - Einmalig diesen Konsolenbefehl ausführen:
                    Code:
                    php composer.phar dumpautoload
                    Dauert keine zwei Minuten.

                    Kommentar

                    Lädt...
                    X