2013-04-10 9 views
14

Ich frage mich, wo die Laravel Event Listeners und Handler setzen. Jemand hat mir gesagt, dass ich sie überall hinbringen kann. Das habe ich bisher versucht.Wo setze ich Ereignis-Listener und Handler?

# 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', 
)); 

Antwort

22

Ich gehe davon aus, dass Sie dies zu fragen, weil sie nicht arbeiten, anstatt zur Bestätigung von etwas, das Sie arbeiten habe.

Es ist zwar richtig, dass Sie Event-Listener überall hin mitnehmen können, aber Sie müssen sicherstellen, dass sie tatsächlich einbezogen werden - Laravel durchsucht Ihren Quellcode nicht nach ihnen.

Mein Lieblingsort zum Einschließen solcher Dateien ist in start/global.php. Wenn Sie im unteren Teil der Datei nachsehen, wo die Filter enthalten sind, können Sie Ihre Listener ebenfalls hinzufügen. Es wäre saubersten sie alle in einem Zuhörer zu halten Datei, wie alle Ihre Routen in einer Routen-Datei sind ...

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

Danke, das hat für mich funktioniert! – Strernd

+5

+1 Netter Vorschlag. Aber ich frage mich, ob es noch eine andere interessante Alternative gibt ... vielleicht einen "app/listeners" -Ordner für Class-Listener zu erstellen ...? Und '' app_path(). '/ Listeners', 'zu' ClassLoader :: addDirectories (array ('unter' app/start/global.php' ...? –

+0

Ich denke, das würde für die Handler funktionieren, aber seit der Listener sind eigentlich keine Klassen Ich glaube nicht, dass sie jemals geladen werden werden –

12

Meine persönliche Meinung ist, dass es in der Regel eine schlechte Praxis ist Event-Listener einen Topf zu werfen in ein einzelner Ort. Sicher, heute brauchst du nur noch 2 oder 3, aber der Umfang kann jederzeit zu jedem Projekt hinzugefügt werden, was viel mehr hinzufügen kann.

Stattdessen erstelle ich im Allgemeinen ein Verzeichnis unter dem Verzeichnis app (z. B. app/CompanyName) und setzen Sie alle meine Anwendung spezifischen Code dort. Sagen Laravel, wie Sie Ihre Dateien zu finden, Sie können dann Ihre composer.json llike dieses Update:

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

Danach, sollten Sie composer dump-autoload laufen.

Jetzt können Sie Namespace-Verzeichnisse innerhalb Ihrer benutzerdefinierten Anwendungsverzeichnis, wie app/CompanyName/Events/, und in der Lage zu entmischen aus Ihrer Veranstaltung Zuhörer in Gruppen, die Sinn machen, erstellen und sie zum Beispiel im Inneren eines Dienstleisters, setzen:

<?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() 
    { 
     // ... 
    } 
} 

Jetzt können Sie diesen Service-Provider zu Ihrem app/config/app.php hinzufügen und gut sein, zu gehen und alle Ihre damit verbundenen Ereignis-Listener in einer einzigen Datei, und alle Ihre Event-Listener in einem einzigen Verzeichnis, aber getrennt, so dass, wenn etwas schief läuft mit einem von ihnen müssen Sie nicht durch alle von ihnen suchen, um zu finden, wo der Fehler geschieht.

NB: Ich kam nicht als eine Übung, aber ich fand es irgendwo auf dem Weg. Ich kann mich jedoch nicht erinnern, wo es war.

+0

Ist es generell eine gute Übung, sich mit derselben Provider-Klasse zu registrieren und zu hören? Wäre es nicht besser, eine dedizierte Listener-Klasse zu haben? – kitensei

+0

Nein , Sie haben Recht, es ist besser, die beiden zu trennen, damit Sie Ihre Ereignis-Listener leichter und ohne Unordnung von der verbindlichen Registrierung des Dienstanbieters testen können.Ich habe sie oben nur als Beispiel für die Registrierung eines Ereignis-Listeners eingefügt Dies ist im Grunde mein Punkt oben - registrieren Sie die Listener innerhalb eines Service-Providers, und Sie können immer noch die vollständige Kontrolle über _ where_ die tatsächliche Methode, die "Listening" platziert ist. –

Verwandte Themen