2016-08-19 139 views
0

我想用作曲家維護一個簡單的WordPress插件的文件。該插件代碼使用三個文件:作曲家自動加載包括不正確的版本

  • dmg_custom_menu_widget.php - 需要的類和註冊與WordPress
  • WP_Custom_Menu_Widget.php該插件的文件 - 主窗口部件類
  • WP_Widget_Base.php - 由WP_Custom_Menu_Widget.php

我延長使用作曲家安裝插件代碼並獲取依賴關係。

如果文件被dmg_custom_menu_widget.php使用自動加載作曲文件中像這樣包括:

require_once 'vendor/autoload.php'; 

我得到一個「致命錯誤:調用未定義的方法......」,因爲它包括使用老版本的WP_Widget_Base.php通過dmg-custom-menu-widget的基本目錄之外的另一個小部件插件。

如果文件是直接由dmg_custom_menu_widget.php使用包括:

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

我沒有得到任何錯誤,因爲正確的文件是包括在內。

這是相關的文件夾結構:

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 

其他信息

如果該文件夾dmg-related-pages-widget被刪除,正確的文件是包括在內。

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

你可以加你'composer.json'嗎?我想你自己加了這個插件的自動加載,對吧? – vfsoraki

+0

我已經添加了composer.json文件。自動加載由作曲家完成。 – theHands

回答

1

檢查被納入正確的vendor/autoload.php

也許你的問題是,你的工作目錄是dmg-related-pages-widget,當dmg_custom_menu_widget.php包括vendor/autoload.php,它加載的文件中dmg-related-pages-widget不是一個在dmg_custom_menu_widget。如果有其他腳本包含dmg_custom_menu_widget.php,則可能會發生這種情況。在PHP中,工作目錄是默認發佈PHP解釋器的地方,如果是Web服務器,則是「document_root」。

要檢查是否有問題,請在vendor/autoload.php之前加,dmg_custom_menu_widget.php。如果有效,那麼你知道這個問題。還有getcwd()函數來幫助臨時更改工作目錄。

還有另外一種可能性,那就是錯誤的vendor/autoload.php被包含在dmg_custom_menu_widget.php包含的vendor/autoload.php之前。這意味着,錯誤的自動加載器會在正確的自動加載器之前註冊,並嘗試首先加載類。所以錯誤的類首先被加載。

+0

我通過使用絕對路徑檢查了正確的autoload.php文件。但是你的回答讓我想到了這個http://stackoverflow.com/questions/35598258/composer-autoload-always-comes-first,並認識到兩個作曲家自動加載器正在啓動,最後一個被註冊在'dmg-related- pages-widget'正在加載依賴關係的過期版本。不知道我是否應該將答案標記爲正確 - 這不是導致正確答案? – theHands

+0

'$ prepend'!無論如何,您可以選擇將其標記爲正確的,也可以對其進行編輯,使其包含Composer的自動加載器的行爲。 upvote會很好,但。 – vfsoraki