2013-04-10 132 views
14

我想知道在哪裏把Laravel事件監聽器和處理程序。有人告訴我,我可以把它們放在任何地方。這是我到目前爲止所嘗試的。我在哪裏放置事件監聽器和處理程序?

# listeners/log.php 
<?php 
Event::listen('log.create', '[email protected]'); 

# handlers/LogHandler.php 
<?php 
class LogHandler { 
     public function create(){ 
      $character = new Character; 
      $character->name = "test"; 
      $character->save(); 
    } 
} 

# controllers/MainController.php 
    public function test(){ 
     Event::fire('log.create'); 
     return "fired"; 
    } 

# start/global.php 
ClassLoader::addDirectories(array(
    app_path().'/commands', 
    app_path().'/controllers', 
    app_path().'/models', 
    app_path().'/database/seeds', 
    app_path().'/libraries', 
    app_path().'/listeners', 
    app_path().'/handlers', 
)); 

回答

22

我打算假設你問這是因爲他們沒有工作,而不是確認你已經工作的東西。

雖然您可以將事件偵聽器置於任何地方,但您需要確保它們實際上會包含在內 - Laravel不會搜索您的源代碼尋找它們。我最喜歡的地方是start/global.php。如果您查看文件底部的內容,您可以看到包含過濾器的位置,您也可以執行相同操作來包含監聽器。這將是最乾淨的,讓他們都在同一個文件的聽衆,喜歡的所有路由都在一個路由文件...

# start/global.php 
require app_path().'/filters.php'; 
+0

謝謝,這對我有用! – Strernd 2013-04-11 14:43:01

+5

+1不錯的建議。然而,我想知道是否有另一個有趣的替代方案...也許爲Class監聽器創建一個「app/listeners」文件夾...?並將'app_path()。'/ listeners',''添加到'ClassLoader :: addDirectories(array('at app/start/global.php' ...? – 2013-09-01 17:41:18

+0

我認爲這對於處理程序是有效的,但是因爲聽衆實際上並不是類,我不認爲他們會被加載嗎? – 2013-09-01 18:02:58

12

個人觀點是,它是不好的做法一般忍下事件監聽器一個地方。當然,今天你只需要2或3個,但是可以隨時將範圍添加到任何項目,可能會增加更多。

相反,我通常在app目錄下創建一個目錄(例如app/CompanyName),並將所有特定於應用程序的代碼放在那裏。告訴Laravel如何找到你的文件,那麼你可以llike此更新composer.json:

"autoload": { 
    "classmap": [ 
     // ... 
    ], 
    "psr-4": { 
     "CompanyName\\" : "app/" 
    }, 
} 

之後,一定要運行composer dump-autoload。現在

,您可以創建命名空間的目錄自定義應用程序目錄裏面,像app/CompanyName/Events/,並能夠將您的事件偵聽器分離出成有意義的羣體,並把他們的服務提供商的內部,例如:

<?php namespace CompanyName/Events; 
// File: app/CompanyName/Events/LogEventsProvider.php 

use Illuminate\Support\ServiceProvider; 

class LogEventsProvider extends ServiceProvider 
{ 
    public function register() 
    { 
     Event::listen('log.create', 'CompanyName/Events/[email protected]'); 
    } 

    public function create() 
    { 
     // ... 
    } 
} 

現在可以將這個服務提供程序添加到您的app/config/app.php和好到哪裏去,並把所有的相關的事件偵聽器在一個單一的文件,您的所有事件偵聽器在一個單獨的目錄,但獨立的,因此如果他們中的一個人出現了問題,您不必通過搜索所有人來找出發生錯誤的位置。

注意:我沒有把這作爲一個練習,但是在一路上找到了它。然而,我不記得它在哪裏。

+0

一般來說,註冊並使用相同的Provider類進行監聽是否是一種很好的做法?有沒有專門的監聽器類會更好? – kitensei 2015-02-10 13:00:00

+0

否,那麼你是正確的,將它們分開是更好的做法,它可以讓你更容易地測試你的事件監聽器,而不會有任何來自服務提供者綁定註冊的混亂,我只在上面作爲例子說明如何註冊一個事件監聽器這基本上就是我的觀點 - 在服務提供者內部註冊監聽者,並且你仍然可以完全控制_where_實際的「監聽」方法。 – 2015-02-10 14:21:27

相關問題