2014-11-05 65 views
0

我有以下目錄結構Laravel宏不自動加載

app 
| ... 
| lib 
| | Macro.php 
| | Events.php 
| ... 

在我composer.json我有

"autoload": { 
    "classmap": { 
     ... 
     "app/lib" 
     ... 
    } 
} 

Events.php加載罰款,並更新數據庫,當事件觸發:

<?php 

Event::listen('auth.login', function($user) { 

    $user->last_login = new DateTime; 
    $user->save(); 

}); 

Macros.php將始終返回錯誤Method messageBox does not exist如果宏是在視圖中使用:

<?php 

Form::macro('test', function() 
{ 
    return 'test'; 
}); 

我已經運行composer dump-autoload。爲什麼Macros.php不自動加載?

回答

1

composer.json中的自動加載classmap節激動地指出:類。所以在這種情況下它不會幫助你,因爲你在那個文件中沒有類聲明。但是,您可以自動加載files以及與作曲家,加入這個以自動加載部分:

"autoload": { 
    "classmap": [ 
     ... 
    ], 
    "files": [ 
     "app/lib/Macros.php" 
    ] 
} 

作爲替代方案,你可以隨時手動包括Laravel的app/start/global.php像這樣的文件:

require app_path() . '/lib/Macros.php'; 
+0

感謝 - 這是一個關於自動加載文件的好建議。我仍然不明白爲什麼'Event :: listen'工作,而'Form :: macro'沒有。糾正我,如果我錯了,但他們都不是他們調用他們的門面的靜態方法? – darronz 2014-11-05 17:32:23

+1

我已經試過在乾淨的Laravel安裝上模擬你的場景,事件或宏工作都沒有,除非預先加載這個文件,這是預期的(所以我不知道它是如何在你的情況下工作的,沒有以某種方式明確包括'Events.php'文件)。我也注意到,我的第一個關於使用composer autoload文件的建議(雖然是一種有效的自動加載方式)在這種情況下不起作用,因爲它在Facades被別名之前包含代碼,並且它會拋出Class not found錯誤。它工作的唯一方法是將文件包含在'global.php'中。 – Bogdan 2014-11-05 18:22:39

+0

你100%正確。我只是嘗試了相同的結果。 'last_login'正在更新,因爲我最近從'zizaco/Confide'切換到'cartalyst/Sentry',並且機制在其他地方。我想'last_login'沒有被記錄在舊系統中,我從來沒有注意到。 – darronz 2014-11-06 04:06:48