Vraag Waar plaats ik evenement luisteraars en handlers?


Ik vraag me af waar ik de Laravel Event-luisteraars en -handlers moet plaatsen. Iemand heeft me verteld dat ik ze overal kan plaatsen. Dit is wat ik tot nu toe heb geprobeerd.

# listeners/log.php
<?php
Event::listen('log.create', 'LogHandler@create');

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

14
2018-04-10 18:11


oorsprong


antwoorden:


Ik ga ervan uit dat je dit vraagt ​​omdat ze niet werken, eerder dan dat je bevestigt dat je iets hebt dat werkt.

Hoewel het klopt dat je eventlisteners overal kunt plaatsen, moet je ervoor zorgen dat ze daadwerkelijk worden opgenomen - Laravel doorzoekt je broncode niet om ze te vinden.

Mijn favoriete plek om dergelijke bestanden op te nemen is in start/global.php. Als u de onderkant van het bestand bekijkt, kunt u zien waar de filters zijn opgenomen. U kunt hetzelfde doen om uw luisteraars op te nemen. Het zou het schoonste zijn om ze allemaal in één luisteraarsbestand te bewaren, alsof al je routes zich in één routesbestand bevinden ...

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

22
2018-04-10 22:56



Mijn persoonlijke mening is dat het in het algemeen een slechte gewoonte is om gebeurtenisluisteraars op één plaats te blokkeren. Natuurlijk heb je vandaag nog maar 2 of 3 nodig, maar de scope kan op elk moment aan elk project worden toegevoegd, mogelijk met veel meer.

In plaats daarvan maak ik meestal een map onder de app map (bijv. app/CompanyName) en plaats al mijn toepassingsspecifieke code daar. Om Laravel te vertellen hoe u uw bestanden kunt vinden, kunt u uw composer.json bijwerken als volgt:

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

Daarna moet je rennen composer dump-autoload.

Nu kunt u namespace-directory's aanmaken in uw eigen applicatiedirectory, zoals app/CompanyName/Events/, en in staat zijn om uw evenement luisteraars te scheiden in groepen die logisch zijn, en ze in een serviceprovider te plaatsen, bijvoorbeeld:

<?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/LogEventsProvider@create');
    }

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

Nu kunt u deze serviceprovider toevoegen aan uw app/config/app.php en wees goed om te gaan, en laat al je gelieerde evenementlisteners in een enkel bestand zitten, en ALLE luisteraars van je evenement in een enkele map, maar toch van elkaar gescheiden, zodat als er iets misgaat met één van je, je niet hoeft te zoeken ALLE om te ontdekken waar de fout zich voordoet.

NB: Ik heb dit niet als een oefening bedacht, maar heb het ergens onderweg gevonden. Ik kan me echter niet herinneren waar het was.


12
2018-05-30 20:34