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-&gt;session()-&gt;put('test', 'hello world!'); );。 Ofcos 在web 中间件中。 (或者,这是否意味着,因为它们在 web 中间件中,所以它们在那里是可能的?)再次感谢! :)) 这是依赖注入的例子。这是一个非常广泛的话题,但我可以说 - 你可以使用它。您可以在此处阅读更多信息:laravel.com/docs/master/container#introduction。在事件处理程序中,如果您想使用依赖注入,您必须在构造函数方法中使用它,如下所示:public function __construct(Request $request),然后将该对象保存到类变量中。之后,您将能够在handle 方法中使用它。很抱歉造成混乱,但是依赖注入是一件很难解释的事情:) 视情况而定。 :) 但在我自己看来,依赖注入是更清洁的解决方案。

以上是关于Laravel 5.2:如何从自己的事件监听器访问请求和会话类?的主要内容,如果未能解决你的问题,请参考以下文章

我将如何在后台运行 Laravel 5.2 的队列监听器?

会话过期的 laravel 事件监听器,因为会话过期时没有调用注销事件监听器

如何使用 Laravel 5.2 + Guzzle 6 存储 JWT 并授予用户访问权限

如何在接收事件的多个 Laravel/Lumen 侦听器中保留模型状态?

使用路由 Laravel 5.2 时访问资源时出错

如何在 Laravel 5.2 中手动发送密码重置请求?