2016-08-29 5 views
2

Ich habe bereits für diese Frage versuchte die Suche und ein paar Antworten zu sehen, aber kein Glück ...Composer & Linux Produktionsserver - automatisches Laden nicht funktioniert

Ich habe Komponisten mit Slim-Framework v3 installiert.

Ich bin mit automatischem Dokumenteneinzug für meine Dateien mit PSR-4 in der composer.json-Datei wie folgt:

"autoload": { 
"psr-4": { 
    "App\\": "App" 
} 
} 

Und das ist meine Ordnerstruktur:

enter image description here

Ich betreiben es auf einem localhost Mac OS X El-Capitan mit Apache 2.4 und alles funktioniert wie Magie. Aber wenn ich es auf meine Produktion Linux-Server laden (auch mit Apache 2.4), scheint die automatisch geladen extrem verwirrt zu sein und ich bin immer Fehler wie diese:

Warning: include(/home/friendsapp/public_html/vendor/composer/../../app/Middleware/AuthMiddleware.php): failed to open stream: No such file or directory in /home/friendsapp/public_html/vendor/composer/ClassLoader.php on line 412

Warning: include(): Failed opening '/home/friendsapp/public_html/vendor/composer/../../app/Middleware/AuthMiddleware.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/friendsapp/public_html/vendor/composer/ClassLoader.php on line 412

Fatal error: Class 'App\Middleware\AuthMiddleware' not found in /home/friendsapp/public_html/public/index.php on line 5

ich meine Klassen genau Namensraum habe nach meinem Ordner Struktur.

<?php 

namespace App\Middleware; 

use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 

use \App\Middleware\Middleware; 

use \App\Share\ErrorCode; 
use \App\Models\ResultMessage; 

use \App\Mappers\AccessTokenMapper; 

class AuthMiddleware extends Middleware { 

Jede Hilfe wäre sehr geschätzt! :)

+1

Haben Sie 'composer install' auf Ihrem Server ausgeführt? – Chris

+0

Oder 'Composer Dump-Autoload' –

+0

Soll ich das nicht auf dem Server tun? (zumindest verstehe ich das, wenn ich ein paar Kommentare zu diesem Problem lese) – EpicSyntax

Antwort

8

Mit Blick auf dem Weg in den Fehlern /app/Middleware/AuthMiddleware.php

Es scheint, das Problem durch einen Namensraum Konflikt App\\ verursacht wird, um /app in der Produktionsumgebung zeigt im Gegensatz zu Ihrer PSR-4 Erklärung /App zeigt.

Konflikte zu vermeiden und alle der Namensräume eines bestimmten Verzeichnis zuordnen, um die Autoload classmap oder Config optimize-autoloader (optional) Optionen in composer.json verwenden können, um den physischen Pfad aller Dateien und Objekte in den angegebenen Verzeichnissen zu definieren Komponist zum Laden. Mit der PSR-4-Deklaration wird außerdem versucht, alle Dateien, die nicht in den Klassenmap-Pfaden gefunden werden, aus der Namespace-Pfaddeklaration App zu laden. Zum Beispiel bei Verwendung der Option exclude-from-classmap.

"config": { 
    "optimize-autoloader": true 
}, 
"autoload": { 
    "psr-4": { 
     "App\\": "App/" 
    }, 
    "classmap": [ 
     "App/", 
    ], 
} 

Nach Änderung in Ihrem composer.json, sollten Sie php composer.phar update --lock in Ihrer Entwicklungsumgebung auszuführen.

Dann, nachdem die composer.lock und composer.json Dateien in Ihre Produktionsumgebung hochladen, php composer.phar install --no-dev -o oder php composer.phar dump-autoload --no-dev -o aus der Produktionsumgebung ausgeführt werden.

Das wird -o Option zwingen, den optimize-autoloader Classmapping die Entwicklungspakete (require-dev) von gerade installiert laufen und --no-dev verhindert. Die Verwendung von optimize-autoloader wird für Produktionsumgebungen empfohlen.


Als allgemeine Praxis, wann immer Sie Ihre Entwicklung Änderungen in der Produktionsumgebung Du php composer.phar install --no-dev -oHow to deploy correctly when using Composer's develop/production switch? Siehe ausführen müssen bereitstellen. Auf diese Weise werden die in Ihrer Entwicklungsumgebung unter Verwendung von vorgenommenen Änderungen korrekt in Ihrer Produktionsumgebung installiert.

+0

Das ist eigentlich .. eine gute Antwort, löste mein Problem! Ich loggte mich über SSH ein und lief "php composer.phar dump-autoload -o" und alles scheint gut zu funktionieren. Auch danke für die allgemeinen Praktiken, ich werde sie definitiv übernehmen. – EpicSyntax

+0

Beachten Sie, dass composer.phar automatisch im '--dev'-Modus ausgeführt wird, wenn Sie nicht die 'require-dev'-Abhängigkeiten in Ihrer Produktionsumgebung * benötigen (wie phpunit, phpspec, behat und codesniffer, etc) *, Sie würden davon profitieren, den '--no-dev'-Schalter hinzuzufügen, um zu vermeiden, dass Sie diese Abhängigkeiten installieren (und sich sonst möglicherweise potenziellen Schwachstellen mit Entwicklungsbibliotheken öffnen). – fyrye

+0

Vielen Dank – Sahadev

Verwandte Themen