热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

laravel5.1获取用户的登录状态,事件、监听、中间件的简单应用

事件存在很多方面,比如登录、购买商品、搜索、查看文章等等。监听器监听到事件发生后,会执行一些操作。Laravel使用观察者模式来实现这种监听机制。现在我们通过一个用户登录来讲解一个

事件存在很多方面,比如登录、购买商品、搜索、查看文章等等。 监听器监听到事件发生后,会执行一些操作。Laravel使用观察者模式来实现这种监听机制。 现在我们通过一个用户登录来讲解一个事件,监听一个事件并触发一些操作的全过程。

Registering Events / Listeners

首先,在App/Providers/EventServiceProvider.php中注册事件与监听器之间的映射关系。下面的三个映射关系中我们只用到了LoginEventLoginSuccess

protected $listen = [
'App\Events\LoginEvent' => ['App\Listeners\LoginSuccess'],
'App\Events\LogoutEvent' => ['App\Listeners\LogoutSuccess'],
'App\Events\UserAccess' => ['App\Listeners\UserAccess']
];

然后,在根目录下执行artisan

$ php artisan event:generate

执行命令成功后,分别会在App/EventsApp\Listeners下生成App/Events/LoginEventApp/Listeners/LoginSuccessphp文件

定义事件类

namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class LoginEvent extends Event
{
use SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
function __construct()
{

}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}

LoginEvent事件中什么都没有改动,也不需要改动

定义监听器

现在在App/Listeners中有了一个LoginSuccess.php监听器,为了以后方面,我们在App/Listeners中新建一个基础的监听类ListenerBase.php

namespace App\Listeners;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Services\Statut;
class ListenerBase
{
/**
* The statut intance
*
* @var App\Services\Statut
*/
protected $statut;
/**
* Create a listener event
*
* @param App\Service\Statut $statut
* @return void
*/
function __construct()
{
$this->statut = new Statut;
}
}
?>

ListenerBase.php中实例化了一个Statut类,这个Statut类在App/Services文件夹下,下面我们会用到。

现在来到App/Listeners/LoginSuccess.php

namespace App\Listeners;
use App\Events\LoginEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class LoginSuccess extends ListenerBase
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Handle the event.
*
* @param LoginEvent $event
* @return void
*/
public function handle(LoginEvent $event)
{
$this->statut->setLoginStatut($event);
}
}

LoginSuccess继承了ListenerBase, handle方法中$this->statut->setLoginStatut获取了登录用户的状态

Statut.php

App/Services中新建php文件Statut.php,再此文件中,主要定义了获取当前登录用户的状态的几个方法,当触发事件后,会执行Statut.php文件中的操作

namespace App\Services;
/**
*
*/
class Statut
{ function __construct()
{
# code...
}
/**
* Set the login user statut
*
* @var App\Event\LoginEvent
* @return void
*/
public function setLoginStatut($event){
session()->put('statut', auth()->user()->role->slug);//auth()->user()在用户登录完成后才会有值
}
/**
* Set visitor statut
*
* @return void
*/
public function setVisitorStatut(){
session()->put('statut', 'visitor');
}
/**
* Set the statut
*
* @return void
*/
public function setStatut(){
if(!session()->has('statut')){
session()->put('statut', auth()->check() ? auth()->user()->role->slug : 'visitor');
}
}
}
?>

好了,事件和监听器完成之后,就需要触发操作了,这里我们用中间件(Middleware)

Defining Middleware

使用artisan命令来创建中间件 App/Http/Middleware/App.php

$ php artisan make:middleware App

执行成功后,使用全局方法event

namespace App\Http\Middleware;
use Closure;
use App\Events\LoginEvent;
class App
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
event(new LoginEvent); //实例化App/Events/UserAccess,
return $next($request);
}
}

最后,再将App中间件注册到kernel.php中

namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCOOKIEs::class,
\Illuminate\COOKIE\Middleware\AddQueuedCOOKIEsToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\App\Http\Middleware\App::class, //App中间件
];

完成上面的操作后,就可以获取用户的登录状态了。在Statut.php中,我们把用户状态分为visitoradmin,user,根据登录用户的不同状态来显示出不同的内容。例如,如果是admin,则他可以进入后台并执行一些操作,如果是user或者visitor,那么他只能浏览一些页面

总结:

了解自己想要做什么,达到什么样的目的,操作的过程中,思路应清晰。


推荐阅读
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 深入解析链表成环问题:剑指Offer第22天的新视角
    本文将详细介绍链表成环问题的多种解法,包括哈希表法、JSON.stringify特殊解法及双指针法,并提供详尽的代码示例。阅读本文,你不仅能够掌握这一经典算法问题的核心技巧,还能了解到更多编程思维的拓展。 ... [详细]
  • 基于OpenCV的小型图像检索系统开发指南
    本文详细介绍了如何利用OpenCV构建一个高效的小型图像检索系统,涵盖从图像特征提取、视觉词汇表构建到图像数据库创建及在线检索的全过程。 ... [详细]
  • 本文介绍了在解决Hive表中复杂数据结构平铺化问题后,如何通过创建视图来准确计算广告日志的曝光PV,特别是针对用户对应多个标签的情况。同时,详细探讨了UDF的使用方法及其在实际项目中的应用。 ... [详细]
  • 在进行模型和动画的导出过程中,需要注意隐藏不必要的场景元素,并确保所需导出的对象位于顶级节点。此外,在导出设置中正确选择节点配置,并为带有动画的对象添加Animator控制器组件,以确保动画能够正常播放。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 在尝试使用Ubuntu 10.04进行Android开发时,遇到了系统无法识别HTC G1设备的情况。本文将详细介绍如何通过配置系统和安装必要的驱动来解决这一问题。 ... [详细]
  • 深入浅出:Hadoop架构详解
    Hadoop作为大数据处理的核心技术,包含了一系列组件如HDFS(分布式文件系统)、YARN(资源管理框架)和MapReduce(并行计算模型)。本文将通过实例解析Hadoop的工作原理及其优势。 ... [详细]
  • 本文档详细介绍了Excel VBA编程中的基本语法,包括循环结构、条件判断、数据处理以及用户界面设计等内容,旨在帮助初学者快速掌握VBA编程技巧。 ... [详细]
  • 在使用Visual Studio构建项目时遇到了IntelliSense错误,具体表现为预期的')'未找到。本文提供了详细的解决方案和可能的原因分析。 ... [详细]
  • LeetCode 104. 二叉树的最大深度 - 深度优先与广度优先策略
    本题探讨了如何通过深度优先搜索(DFS)和广度优先搜索(BFS)两种算法策略来求解二叉树的最大深度问题。二叉树的最大深度定义为从根节点到最远叶子节点的最长路径上的节点数目。 ... [详细]
  • 本文详细介绍了如何利用 Python 语言从文本文件中读取数据,并将其存储为字典格式,涵盖多种实用技巧和示例代码。 ... [详细]
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • 本题要求计算从起点到终点所有最短路径的总权重,使用SPFA算法进行求解。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
author-avatar
fhuwiop
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有