-
Exemplu cu Evenimente in Laravel
-
Definire Evenimente
-
Subsriere mai multe Evenimente
Evenimentele sunt actiuni care se petrec si sunt puse sub observare, iar unul sau mai multi observatori (numiti generic "listeners" - ascultatori) raspund cand evenimentul /actiunea respectiva are loc.
Laravel permite subscrierea si urmarirea mai multor tipuri de evenimente care se petrec in aplicatie.
Manipularea
evenimentelor in Laravel se poate face prin urmatorii pasi:
- Adaugati clasele pt. evenimente si observatori in proprietatea $listen din clasa EventServiceProvider (in fisierul app/Providers/EventServiceProvider.php).
- Proprietatea $listen contine un array cu clasele pt. evenimente (la chei) si observatorii lor (la valoare):
protected $listen =[
'App\Events\EventName_Class'=> [
'App\Listeners\ListenerName_Class',
],
];
- Initiati urmatoarea comanda in Command Line Interface.
- Aceasta comanda va crea automat clasele pentru evenimente si observatori, listate in EventServiceProvider (clasele deja existente pt. evenimentele si observatorii listati nu sunt afectate).
php artisan event:generate
- Clasele pentru evenimente sunt stocate in directorul app/Events/, iar observatorii lor in directorul app/Listeners/.
- Ultimul pas este emiterea evenimentului, cu functia event(new EventName_Class()), sau cu metoda Event::fire(new EventName_Class()).
- Va emite evenimentul la toti observatorii inregistrati pt. EventName_Class. Va returna un array cu raspunsul fiecarui observator inregistrat:
//dispatches an event and gets an array with listeners responses
$event = event(new EventClass_Name($request, $msg));
/*
$event =[
0=>'response from first listener',
1=>'response from second listener',
//...
];
*/
E necesar sa adaugati aceasta linie in clasa controller in care lucrati cu evenimente (
"EventName_Class" e numele clasei cu evenimentul inregistrat):
use App\Events\EventName_Class;
- Daca emiteti evenimentul cu metoda
Event::fire(), e necesar sa adaugati in controller si linia de cod:
use Event;
Exemplu cu Evenimente in Laravel
Aici aveti un exemplu simplu care va va ajuta sa intelegeti cum functioneaza evenimentele in Laravel.
1. Vom crea un controller numit
TestEventController.
Copiati urmatorul cod si salvati-l in "
app/Http/Controllers/TestEventController.php".
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Events\TestEvent;
class TestEventController extends Controller {
//responds to GET /testevent
//returns view with form
public function index(){
return view('add_name_form');
}
//responds to POST /testevent
//returns view with form, passing event-listener response
public function store(Request $request){
if($request->has(['name'])){
$name = $request->name;
$msg ='<h4>Message from controller:</h4>Form data received.';
//dispatch an event and get an array [0=>'listener-response']
$event = event(new TestEvent($request, $msg))[0];
return view('add_name_form', ['event'=>$event]);
}
else return 'Not valid request.';
}
}
2. Acum fixati un Route tip
resource pentru TestEventController.
Adaugati urmatorul cod in fisierul
routes/web.php:
Route::resource('/testevent', 'TestEventController');
3. Copiati urmatorul cod in
resources/views/add_name_form.blade.php pentru a crea view-ul care va afisa formularul:
@isset($event)
<div>
{!!$event !!}
</div>
@endisset
<h4>Add Name</h4>
<form method="post" action="/testevent">
{{ csrf_field() }}
<label>Name: <input type='text' name='name'/></label><br>
<input type='submit' value='Add'/>
</form>
4. Acum trebuie sa inregistram clasa evenimentului si clasa observatorului sau in fisierul
EventServiceProvider.php.
- Deschideti fisierul
app/Providers/EventServiceProvider.php si inregistrati
TestEvent si
TestListener in proprietatea
$listen, ca in acest cod:
protected $listen =[
'App\Events\TestEvent'=> [
'App\Listeners\TestListener',
],
];
5. Pentru a genera clasa evenimentului inregistrat si clasa observatorului, executati urmatoarea comanda in Command-Line-Interface:
php artisan event:generate
- Dupa ce ati executat comanda de mai sus, Laravel va crea clasa
app/Events/TestEvent.php, si clasa observatorului in
app/Listeners/TestListener.php, cu un cod de baza.
6. Copiati urmatorul cod in fisierul
app/Events/TestEvent.php:
<?php
namespace App\Events;
class TestEvent {
//properties that can be used in the listener class
public $name;
public $method;
public $msg;
//Create a new event instance
//Receives the http $request and a message string in $msg
//@return void
public function __construct($request, $msg){
$this->name = $request->name;
$this->method = $request->method();
$this->msg = $msg;
}
}
7. Copiati urmatorul cod in fisierul
app/Listeners/TestListener.php:
<?php
namespace App\Listeners;
use App\Events\TestEvent;
class TestListener {
protected $name;
//Create the event listener
//@return void
public function __construct(){
//
}
//Handle the event
//@param TestEvent $event
//@return string (but in accessor it will be received into an array [0=>'string-response'])
public function handle(TestEvent $event){
$this->name = $event->name;
return $event->msg.'<h4>Message from Event-Listener:</h4>New name: '.$this->name.'<br>Using Method: '.$event->method;
}
}
- Observati ca metoda handle() returneaza un sir ca raspuns, dar functia event() (in controller) va returna raspunsul de la observator intr-un array ( [0=>'response'] ).
8. Porniti serverul php incorporat (comanda:
php artisan serve ), si accesati acesta adresa URL in browser:
//localhost:8000/testevent
- Dupa ce ati vizitat URL-ul de mai sus, browserul va arata o pagina cu un formular, ca in aceasta imagine:
9. Scrieti un Nume in campul formularului si apasati butonul "Add" pentru a testa evenimentul.
- Browserul va arata o pagina ca in aceasta imagine:
Definire Evenimente
O clasa pt eveniment este pur si simplu un container de date care contine informatii referitoare la eveniment. Puteti crea manual
clasa eveniment in directorul "
app/Events/" si
clasa observator (cu o metoda
handle()) in directorul "
app/Listeners/".
Puteti folosi si dependente in clasa observator. Aici este un exemplu de observator care foloseste serviciul
Request (observati liniile rosii):
<?php
namespace App\Listeners;
use Illuminate\Http\Request;
use App\Events\Event_Name;
class Listener_Name {
protected $name;
//automatically receive the Request instance
//@return void
public function __construct(Request $request){
$this->name = $request->name;
}
//Handle the event
//@param TestEvent $event
//@return string
public function handle(TestEvent $event){
return 'New name: '.$this->name;
}
}
Apoi trebuie sa inregistrati clasele eveniment si observator in proprietatea
$listen in
EventServiceProvider.php.
- Puteti adauga oricat de multe evenimente are nevoie aplicatia voastra, in array-ul
$listen. De asemenea, puteti adauga mai multi observatori la un singur eveniment.
protected $listen =[
'App\Events\EventClass_1'=> [
'App\Listeners\ListenerClass_1'
],
'App\Events\EventClass_2'=> [
'App\Listeners\ListenerClass_2',
'App\Listeners\ListenerClass_3'
],
];
Oprirea propagarii unui eveniment
Daca folositi mai multi observatori la un eveniment si vreti sa opriti propagarea unui eveniment la ceilalti observatori. Aplicati:
return false; in metoda
handle() din clasa observator.
Subscriere mai multe Evenimente
"Event subscriber" este o clasa in care se poate face subscriere la mai multe evenimente, permitand sa definiti mai multi observatori de evenimente intr-o singura clasa.
Clasele "EventSubscriber" sunt create in directorul
app/Listeners/ si trebuie sa contina o metoda
subscribe() care va primi ca argument o instanta
$event.
In
subscribe() se aplica metoda
listen() la instanta
$event pentru a inregistra observatorii evenimentului, ca in acest exemplu de clasa "event-subscriber":
<?php
namespace App\Listeners;
class UserEventSubscriber {
//Handle user login events
public function onUserLogin($event){ return 'login';}
//Handle user logout events
public function onUserLogout($event){ return 'logout';}
//Register the listeners for the subscriber
//@param Illuminate\Events\Dispatcher $events
public function subscribe($events){
$events->listen(
'App\Events\LoginEvent',
'App\Listeners\UserEventSubscriber@onUserLogin'
);
$events->listen(
'App\Events\LogoutEvent',
'App\Listeners\UserEventSubscriber@onUserLogout'
);
}
}
- Apoi, trebuie sa creati clasele evenimentelor (aici:
LoginEvent.php si
LogoutEvent.php) in directorul
app/Events/.
Inregistrare clase Event-Subscriber
Dupa ce ati creat o clasa "Event-Subscriber", trebuie sa o inregistrati folosind proprietatea
$subscribe in
EventServiceProvider.php.
- Spre exemplu, sa adaugam clasa
UserEventSubscriber la lista:
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider {
//The event listener mappings for the application
//@var array
protected $listen =[
//
];
//The subscriber classes to register.
//@var array
protected $subscribe =[
'App\Listeners\UserEventSubscriber',
];
}
- Apoi, in controller, apelati functia
event() cu evenimentul care vreti sa il expediati.
event(new LoginEvent());
event(new LogoutEvent());
- Documentatie:
Laravel - Events