Laravel 5.2:如何从自己的事件监听器访问请求和会话类?
Posted
技术标签:
【中文标题】Laravel 5.2:如何从自己的事件监听器访问请求和会话类?【英文标题】:Laravel 5.2 : How to access Request & Session Classes from own Event Listener? 【发布时间】:2016-07-29 08:56:24 【问题描述】:在Laravel 5.2
,我添加了我的事件监听器(到app\Providers\EventServiceProvider.php
),比如:
protected $listen = [
'Illuminate\Auth\Events\Login' => ['App\Listeners\UserLoggedIn'],
];
然后生成它:
php artisan event:generate
然后在事件监听器文件本身app/Listeners/UserLoggedIn.php
,就像:
<?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!');
这显示了以下错误:
ErrorException in UserLoggedIn.php line 28:
Argument 2 passed to App\Listeners\UserLoggedIn::handle() must be an instance of App\Listeners\Request, none given
我错过了什么,或者我该如何解决这个问题?
最终,一旦用户登录,我需要写入 Laravel 会话。谢谢大家。
【问题讨论】:
【参考方案1】:您正在尝试初始化App\Listeners\Request;
,但它应该是Illuminate\Http\Request
。这也可能行不通,所以对于 B 计划,请使用以下代码:
public function handle(Login $event)
app('request')->session()->put('test', 'hello world!');
依赖注入更新:
如果你想在事件中使用依赖注入,你应该像这样通过构造函数注入类:
public function __construct(Request $request)
$this->request = $request;
然后在handle
方法中你可以使用存储在构造函数中的本地请求变量:
public function handle(Login $event)
$this->request->session()->put('test', 'hello world!');
【讨论】:
哇,好用!谢谢!! --- 这意味着,我不能像正常的routes.php
文件那样使用我处理请求和会话的方式。相反,一旦进入事件处理程序,我必须按照你的方式行事。请问我说的对吗?
我不知道您过去是如何处理routes.php
文件中的请求的。请举一些例子,然后我可以说点什么:)
我的意思是,在routes.php
中,当我想访问请求和会话时,我使用类似:Route::get('home', function(Request $request) $request->session()->put('test', 'hello world!'); );
。 Ofcos 位于web
中间件中。 (或者,这是否意味着,因为它们在 web
中间件中,所以它们在那里是可能的?)再次感谢! :))
这是依赖注入的例子。这是一个非常广泛的话题,但我可以说 - 你可以使用它。您可以在此处阅读更多信息:laravel.com/docs/master/container#introduction。在事件处理程序中,如果您想使用依赖注入,您必须在构造函数方法中使用它,如下所示:public function __construct(Request $request)
,然后将该对象保存到类变量中。之后,您将能够在handle
方法中使用它。很抱歉造成混乱,但是依赖注入是一件很难解释的事情:)
视情况而定。 :) 但在我自己看来,依赖注入是更清洁的解决方案。以上是关于Laravel 5.2:如何从自己的事件监听器访问请求和会话类?的主要内容,如果未能解决你的问题,请参考以下文章
会话过期的 laravel 事件监听器,因为会话过期时没有调用注销事件监听器
如何使用 Laravel 5.2 + Guzzle 6 存储 JWT 并授予用户访问权限