- 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:
  1. 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',
      ],
    ];
    
  2. 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/.
  3. 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:

Events form page

9. Scrieti un Nume in campul formularului si apasati butonul "Add" pentru a testa evenimentul.
- Browserul va arata o pagina ca in aceasta imagine:

Event Result

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

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Care tag se foloseste in <table> pentru a crea celula de tip "header"?
<thead> <th> <td>
<table><tr>
  <th>Title 1</th>
  <th>Title 2</th>
</tr></table>
Ce proprietate CSS seteaza distanta dintre randuri?
line-height word-spacing margin
.some_class {
  line-height: 150%;
}
Care functie deschide o noua fereastra.
alert() confirm() open()
document.getElementById("id_button").onclick = function(){
  window.open("http://coursesweb.net/");
}
Indicati functia PHP care returneaza un array cu numele fisierelor si directoarelor dintr-un director.
mkdir() scandir() readdir()
$ar_dir = scandir("dir_name");
var_export($ar_dir);
Care din urmatoarele forme a verbului "sleep" (a dormi) se foloseste pentru viitor?
sleeping slept will sleep
He will sleep there.
- El va dormi acolo.
Care din urmatoarele forme a verbului "dormir" (a dormi) se foloseste pentru viitor?
dormido dormirá durmiendo
Él dormirá allí.
- El va dormi acolo.
Laravel tutorial - Evenimente

Last accessed pages

  1. Incarcare imagini pe server si afisare cu Ajax (6)
  2. Curs si Tutoriale Ajax (66)
  3. Bubbles3 (3489)
  4. Prezentul simplu - Exercitii si teste incepatori (758)
  5. Butterfly Kyodai (2204)

Popular pages this month

  1. Bubbles3 (3489)
  2. Gramatica limbii engleze - Prezentare Generala (2797)
  3. Prezentul simplu si continuu - Present Tense Simple and Continuous (2526)
  4. Butterfly Kyodai (2204)
  5. Zuma Deluxe (2083)