2016-04-08 12 views
3

In Laravel 5.2, ich habe meine Event-Listener (in app\Providers\EventServiceProvider.php), wie hinzugefügt:Laravel 5.2: Wie Zugriff auf Request & Session-Klassen von eigenen Event Listener?

protected $listen = [ 
    'Illuminate\Auth\Events\Login' => ['App\Listeners\UserLoggedIn'], 
]; 

Dann erzeugt es:

php artisan event:generate 

Dann in der Event-Listener selbst app/Listeners/UserLoggedIn.php Datei, es ist wie:

<?php 

namespace App\Listeners; 

use App\Listeners\Request; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use Illuminate\Auth\Events\Login; 

class UserLoggedIn 
{ 
    /** 
    * Create the event listener. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 

    } 

    /** 
    * Handle the event. 
    * 
    * @param Login $event 
    * @return void 
    */ 
    public function handle(Login $event, Request $request) 
    { 
     $request->session()->put('test', 'hello world!'); 
    } 
} 

Dies zeigt mir folgende Fehler:

ErrorException in UserLoggedIn.php line 28: 
Argument 2 passed to App\Listeners\UserLoggedIn::handle() must be an instance of App\Listeners\Request, none given 

Was habe ich vermisst, oder wie kann ich das bitte lösen?

  • Letztlich muss ich in Laravel Sessions schreiben, sobald der Benutzer angemeldet hat.

Vielen Dank.

Antwort

6

Sie versuchen, App\Listeners\Request; zu initialisieren, aber es sollte Illuminate\Http\Request sein. Auch könnte dies nicht funktionieren, so dass für Plan B diesen Code verwenden:

public function handle(Login $event) 
{ 
    app('request')->session()->put('test', 'hello world!'); 
} 

Dependency Injection Update:

Wenn Sie wollen Dependency Injection in Ereignisse verwenden, sollten Sie Klassen durch Konstruktor injizieren etwa so:

public function __construct(Request $request) 
{ 
    $this->request = $request; 
} 

dann in handle Methode können Sie lokale Anforderungsvariable verwenden, die in gespeichert wurde Erbauer:

public function handle(Login $event) 
{ 
    $this->request->session()->put('test', 'hello world!'); 
} 
+0

Woww das funktioniert! Vielen Dank!! --- Das heißt also, ich kann die Art und Weise, wie ich Anfragen und Sessions behandle, NICHT wie die normale 'routes.php' Datei benutzen. Stattdessen muss ich, sobald ich in den Event-Handlern bin, deinen Weg gehen. Habe ich bitte recht? –

+0

Ich weiß nicht, wie Sie Anfragen in der 'routes.php' Datei bearbeitet haben. Bitte zeigen Sie ein Beispiel und dann kann ich etwas sagen :) –

+0

Ich meine, in 'routes.php', wenn ich auf Requests & Sessions zugreifen möchte, verwende ich wie:' Route :: get ('home', Funktion (Request $ request) {$ request-> session() -> put ('test', 'Hallo Welt!');}); '. Ofcos, die in der 'Web'-Middleware enthalten ist. (Oder heißt es, diese sind dort möglich, weil sie sich in 'web'-Middleware befinden?) Nochmals vielen Dank! :)) –