Ankündigung

Einklappen
Keine Ankündigung bisher.

Benutzen von autoload in anderer Ordnerstruktur

Einklappen

Neue Werbung 2019

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

  • Benutzen von autoload in anderer Ordnerstruktur

    Hallo zusammen,
    ich habe ein PHP Projekt, und nun musste die Ordnerstruktur umgestellt werden. Jetzt funktioniert trotz autoload das Projekt nicht mehr. Fehlermeldung:

    PHP Warning: require(C:\Users\user1\Desktop\git\projektname\src \projektname/vendor/autoload.php): failed to open stream: No such file or directory in C:\Users\user1\Desktop\git\projektname\src\projekt name\run.php on line 21


    Falls ich meinen Test ausführen will, bekomme ich folgende Fehlermeldung:

    Error: Class 'projektname\RandomKlasse' not found

    C:\Users\user1\Desktop\git\projektname\tests\proje ktname\RandomTestFürRandomKlasse
    .php:10

    Zu erwähnen ist, dass das Projekt funktioniert, sobald der vendor Ordner im gleichen Ordner wie run.php + meine ganzen Klassen ist.


    Meine Ordnerstruktur sieht wie folgt aus:

    PHP-Code:
    projektname
    |
    +---
    src
    |    |
    |    +
    projektname
    |            |
    |            +
    resources (Ordner mit notwendigen .json und .yml Dateien)
    |            |
    |            + 
    run.php
    |            + RandomKlasse.php
    |                   
    +---
    tests
    |      |
    |      +
    projektname
    |             |
    |             +
    RandomTestFürRandomKlasse.php
    |
    +---
    vendor
    |       |
    |       +--
    Ordner für monolog,phpunit,symfony usw.
    |       +--
    autoload.php
    |
    |
    |
    +
    composer.json
    +composer.lock
    +composer.phar
    +phpunit.xml
    +README.md 
    Meine autoload.php sieht so aus:
    PHP-Code:
    <?php

    // autoload.php @generated by Composer

    require_once __DIR__ '/composer/autoload_real.php';

    return 
    ComposerAutoloaderInit652d47d5aa164c2481679ffee0b92b7c::getLoader();

    Meine composer.json sieht ungefähr so aus:

    PHP-Code:
    {
      
    "name""user1/projektname",
       
    "description""some description",
       
    "minimum-stability""stable",
       
    "license""proprietary",
       
    "authors": [
           {
               
    "name""user1",
               
    "email""user1@somecompany.com"
           
    }
       ],

       
    "autoload": {
         
    "classmap": ["src/"]
       },

        
    "require": {
            
    "author/some-sdk""^1.0",
            
    "symfony/yaml""^4.1",
            
    "monolog/monolog""^1.23",
            
    "phpunit/phpunit""^7"
        
    }


    Meine run.php sieht so aus:

    PHP-Code:
    <?php

    use Symfony\Component\Yaml\Yaml;
    .
    .
    .
    use 
    Monolog\Logger;
    use 
    Monolog\Handler\StreamHandler;
    use 
    PHPunit\Framework\TestCase;

    include(
    "RandomKlasse.php");
    include( ... );

    # Composer autoload
    require __DIR__ '/vendor/autoload.php';

    // some functionality
    Meine RandomKlasse sieht so aus:

    PHP-Code:
    <?php

    namespace projektname;
    class 
    RandomKlasse
    {
        private 
    $attribute;

        public function 
    __construct($attribute)
        {
            
    $this->attribute $attribute;
        }

    // getters and setters
    Und meine RandomTestKlasse:

    PHP-Code:
    <?php

    namespace projektname;
    use 
    projektname\RandomKlasse;

    class 
    RandomTestKlasse extends \PHPUnit\Framework\TestCase
    {
        public function 
    test_Constructor()
        {
            
    $randomKlasse= new RandomKlasse("attribute");
            
    //$this->assertEquals ... 
        
    }
    Meine Frage nun ist:
    Wie kriege ich es hin, dass ich vendor außerhalb lasse und mein Projekt trotzdem via autoload ineinander greift? Habe ich irgendwelche uses/includes/namespaces vergessen?


    VG

  • #2
    ist das kompliziert:
    PHP-Code:
    # Composer autoload
    require __DIR__ '/vendor/autoload.php'
    PHP Warning: require(C:\Users\user1\Desktop\git\projektname\src \projektname/vendor/autoload.php): failed to open stream: No such file or directory in C:\Users\user1\Desktop\git\projektname\src\projekt name\run.php on line 21
    vendor ist ja auch kein unterordner von src\projectname oder doch ?

    Kommentar


    • #3
      Mit dieser Struktur muss ich aber leider arbeiten, unabhängig davon wie kompliziert es ist.

      Nein, vendor ist kein Unterordner von projektname\src\projektname.

      Wie schon gesagt, falls ich den vendor Ordner dorthin verschiebe, funktioniert es auch.
      Die Frage ist, wie krieg ich es hin, dass autoload funktioniert wenn es im Überordner ist? Also nicht C:..\projektname\src\projekt name, sondern nur in C:..\projektname

      Kommentar


      • #4
        Außerdem orientier ich mich nur nach diesem Muster:
        https://gist.github.com/GaryRogers/0fb41d649fa75d58eb8f

        Kommentar


        • #5
          Zitat von JuriW Beitrag anzeigen
          Nein, vendor ist kein Unterordner von projektname\src\projektname.
          Deswegen funktioniert das include() ja auch nicht, da du ihm ja explizit sagst, es soll den vendor/-Ordner im aktuellen Verzeichnis (src/projektname/) suchen.

          Kommentar


          • #6
            Ich bekomme auch wenn ich alle includes auskommentiere oder mit
            PHP-Code:
            ./ 
            versehe dieselbe Fehlermeldung zurück

            Kommentar


            • #7
              Brauch ich eine Datei, die im gleichen Unterordner wie mein Vendor-Ordner ist, um dieser mitzuteilen, dass autoload.php benutzt werden soll? Falls ja, wie kann ich dann auf meine run.php zugreifen?

              Kommentar


              • #8
                Okay es hat sich erledigt.
                Meine Lösung:

                in meiner run.php habe ich statt

                require __DIR__ . '/vendor/autoload.php';

                nun

                require __DIR__ . '/../../vendor/autoload.php';

                Die Anwendung funktioniert wieder.

                Mein Test meldet jedoch immer noch, dass die Klasse nicht geladen werden kann.

                Kommentar


                • #9
                  Schau mal, ob die autoload_classmap.php korrekt ist.

                  Kommentar


                  • #10
                    Zitat von JuriW Beitrag anzeigen
                    Mein Test meldet jedoch immer noch, dass die Klasse nicht geladen werden kann.
                    Der Test muss natürlich auch den Autoloader laden ...

                    Kommentar


                    • #11
                      In meiner autload_classmap.php sind über 500 Einträge in einem Array
                      unter anderem
                      • meine Klassen die ich benutze in der Form:
                      'KlassenName' => $baseDir . '/src/projektname/KlassenName.php',
                      • diverse Einträge zu PHPUnit in der Form:
                      'PHPUnit\\Framework\\Constraint\\ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php',
                      mit Exceptions, den ganzen Methoden usw.
                      • PharIo - Einträge
                      • ​​weitere Einträge zum Entwickler von PHPUnit
                      • die letzten zwei Einträge sind wieder projektbezogen und sehen in etwa so aus:
                      ​​​​​​​ 'projektname\\KlassenName' => $baseDir . '/src/projektname/KlassenName.php',

                      Kommentar


                      • #12
                        Ohje, daran hab ich nicht gedacht Vielen dank an dich und das Forum!

                        Kommentar

                        Lädt...
                        X