2016-08-19 4 views
0

Ich versuche Composer zu verwenden, um Dateien für ein einfaches Wordpress-Plugin zu verwalten. Der Plugin-Code verwendet drei Dateien:Composer Autoload mit falschen Versionen

  • dmg_custom_menu_widget.php - die Datei, die Klassen und registriert das Widget mit Wordpress erfordert
  • WP_Custom_Menu_Widget.php - die wichtigste Widget-Klasse
  • WP_Widget_Base.php - erweitert durch WP_Custom_Menu_Widget.php

I Verwenden Sie Composer, um den Plugin-Code zu installieren und die Abhängigkeit zu holen.

Wenn Dateien von dmg_custom_menu_widget.php mit dem Komponisten Autoload-Datei wie folgt enthalten:

require_once 'vendor/autoload.php'; 

ich einen bekommen ‚Fatal error: Call to undefined Methode ...‘, weil es eine alte Version von WP_Widget_Base.php wird einschließlich verwendet durch ein anderes Widget-Plugin außerhalb des Basisverzeichnisses von dmg-custom-menu-widget.

Wenn Dateien direkt von dmg_custom_menu_widget.php enthalten sind, unter Verwendung von:

require_once 'vendor/DMG/WP_Widget_Base/src/WP_Widget_Base.php'; 
require_once 'src/WP_Custom_Menu_Widget.php'; 

ich keine Fehler, da die richtige Datei enthalten ist.

Dies ist der entsprechende Ordnerstruktur:

plugins/ 
    dmg-related-pages-widget/ 
    vendor/ 
     DMG/ 
     WP_Widget_Base/ 
      src/ 
      WP_Widget_Base.php  <- File being included 
    dmg-custom-menu-widget/ 
    dmg_custom_menu_widget.php  <- Calls require_once 'vendor/autoload.php' 
    vendor/ 
     autoload.php     <- Composer autoload file 
     DMG/ 
     WP_Widget_Base/ 
      src/ 
      WP_Widget_Base.php  <- File that should be included 

Zusatzinfo

Wenn der Ordner dmg-related-pages-widget gelöscht wird, wird die richtige Datei enthalten.

Composer.json

{ 
    "name"  : "DMG/WP_Custom_Menu_Widget", 

    "license" : "GPL-3.0", 

    "repositories": 
    [ 
     { 
      "type": "git", 
      "url": "https://[email protected]/dgifford/wp_widget_base.git" 
     } 
    ], 

    "require": 
    { 
     "DMG/WP_Widget_Base" : "dev-master" 
    }, 


    "autoload": 
    { 
     "classmap": 
     [ 
      "src/WP_Custom_Menu_Widget.php" 
     ] 
    } 
} 
+0

Können Sie hinzufügen 'composer.json'? Ich denke du hast das Autoloading für dieses Plugin selbst hinzugefügt, oder? – vfsoraki

+0

Ich habe die Datei composer.json hinzugefügt. Autoloading erfolgt durch den Komponisten. – theHands

Antwort

1

Überprüfen Sie, ob die richtige vendor/autoload.php enthalten wird.

Vielleicht ist Ihr Problem ist, dass Ihr Arbeitsverzeichnis dmg-related-pages-widget ist, und wenn dmg_custom_menu_widget.phpvendor/autoload.php enthält, lädt er die Datei in dmg-related-pages-widget nicht dem in dmg_custom_menu_widget. Dies kann passieren, wenn ein anderes Skript vorhanden ist, das dmg_custom_menu_widget.php enthält. In PHP ist das Arbeitsverzeichnis, in dem der PHP-Interpreter standardmäßig ausgegeben wurde, oder "document_root" im Falle eines Webservers.

Um zu überprüfen, ob dies das Problem ist, fügen Sie chdir(__DIR__); hinzu, bevor Sie vendor/autoload.php in dmg_custom_menu_widget.php einfügen. Wenn es funktioniert, dann kennen Sie das Problem. Es gibt auch eine getcwd() Funktion, um temporäres Arbeitsverzeichnis zu ändern.

Es gibt noch eine andere Möglichkeit, dass das falsche vendor/autoload.php irgendwie enthalten ist, bevor dmg_custom_menu_widget.php das Recht vendor/autoload.php enthält. Dies bedeutet, dass der falsche Autoloader sich vor dem richtigen Autoloader anmeldet und zuerst versucht, die Klassen zu laden. Daher wird zuerst die falsche Klasse geladen.

+0

Ich habe überprüft, dass die korrekte autoload.php-Datei verwendet wurde, indem ein absoluter Pfad verwendet wurde. Aber deine Antwort führte mich zu diesem http://stackoverflow.com/questions/35598258/composer-autoload-always-comes-first und der Erkenntnis, dass zwei Composer Autoloader initiiert wurden und die letzten in 'dmg-related- pages-widget "hat die veraltete Version der Abhängigkeit geladen. Ich bin mir nicht sicher, ob ich deine Antwort richtig schreiben soll - es wird nicht aber zur richtigen Antwort geführt? – theHands

+0

Das '$ prepend'! Wie auch immer, es ist Ihre Wahl, sie als die richtige zu markieren, vielleicht bearbeiten Sie sie so, dass sie das Verhalten des Autoloaders von Composer beinhaltet. Ein Upvote wäre aber nett. – vfsoraki

Verwandte Themen