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

ThinkPHP5行为和钩子-03

自定义钩子现在我们用一个应用自定义钩子的例子来总结下钩子和行为的使用。首先定义一个公共的控制器基类,然后添加一个controller_init钩子,代码如下:<?phpnamespaceap
自定义钩子

现在我们用一个应用自定义钩子的例子来总结下钩子和行为的使用。

首先定义一个公共的控制器基类,然后添加一个 controller_init钩子,代码如下:
namespace app\common\controller;
use think\Controller;
use think\Hook;
use think\Request;
class Base extends Controller
{    
    protected $role;    
    public function __construct(Request $request)      
    {        
        // 添加钩子          
        $result = Hook::listen('controller_init', $this, $request, true);        
        if ($result)
        {            
            // 当前角色名              
            $this-role = $result;          
        }        
        parent::__construct($request);      
    }  
}

接下来,所有的控制器都继承app\common\controller\Base即可实现,所有的正常访问请求都会经过
controller_init钩子位置,然后我们只需要给 controller_init钩子绑定行为。

Index控制器代码修改为:
namespace app\index\controller;
use app\common\controller\Base;
class Index extends Base
{    
    public function index()      
    {        
        return '当前用户角色:' . $this-role;      
    }  
}

我们在 apps/tags.php中添加配置绑定行为 Check,如下:
return [
'controller_init'   =>  ['\app\common\behavior\Check',],
];

注意,先清空之前 apps/common.php中动态绑定的行为。
行为类Check定义如下:
namespace app\common\behavior;
class Check
{    
    public function run($controller, $request)      
    {        
        if ($request-role)
        {
            return $request->role->name;
        }
    }
}

在模块的 common.php文件中添加如下代码绑定另外一个闭包行为,如下:
use think\Hook;
use app\common\Role;
Hook::add('controller_init',function($controller,$request){
        // 绑定请求对象的属性     
        $request->bind('role',new Role($request->param('id')));
    },
    true
);

Role类的代码如下,该类仅用于简单举例,并非一个真正的角色类,所以做了一个简单的实现:
namespace app\common;
class Role
{    
    public $name;
    protected $type = [
    1 => 'admin',
    2 => 'leader',
    3 => 'operator',
    ];    

    public function __construct($id)
    {
        if (isset($this->type[$id]))
        {
            $this->name = $this->type[$id];
        }
        else
        {
            $this->name = 'guest';
        }
    }
}

从这个例子,除了我们已知的知识点,还可以发现几个前面未曾提到的知识点,大家可以消化理解下:

    配置绑定可以和动态绑定混合使用;

    钩子方法传入第三个参数表示在获取到返回值后就会不再执行后续行为;

    动态绑定行为的方法第三个参数可以让某个行为优先执行;

完成以上所有的定义和配置后,下面来进行行为测试,访问URL
http://contoso.org
页面输出显示:
当前用户角色:guest

然后测试访问URL
http://contoso.org?id=1

页面输出显示:
当前用户角色:admin

访问URL
http://contoso.org?id=2

页面输出显示:
当前用户角色:leader
推荐阅读
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • 使用这个技巧要达到的目标:一般来说,模型和控制器你都不会有相同的类名字。让我先创建一个取名为post的model。classPostextendsModel{}现在 ... [详细]
  • Iwanttointegratesort,order,maxandoffsetinafindAllquery.Thefollowingworksfine:我想在fin ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
author-avatar
喵喵妈70929
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有