Thinkphp添加扩展钩子,例子:在门户搜索前添加钩子
首页要知道自己想做一个什么插件,在这里我是想在前台门户的搜索功能前加一个检测用户是否登录的钩子,ThinkCMF 门户默认的模块是 : /app/portal/
一、/public/plugins/ 这个插件目录下添加一个名为搜索 search_login 的目录,这里的名称是根据自己需要填写的;
二、添加一个php文件,文件名为:SearchLoginPlugin.php,文件格式可以参考ThinkCMF插件的格式来新建:
'SearchLogin', 'title' => '门户搜索前登录检测', 'description' => '门户搜索前登录检测', 'status' => 1, 'author' => 'DCR', 'version' => '1.0' ]; public $hasAdmin = 0;//插件是否有后台管理界面 // 插件安装 public function install() { return true;//安装成功返回true,失败false } // 插件卸载 public function uninstall() { return true;//卸载成功返回true,失败false } public function portalSearchBeforeArticle(){ if( !cmf_is_user_login() ){ return '请先登录'; } } }
首先命名 命名空间,继承cmf的插件类;
$info这个属性一定要填写,格式也必须一致;
install() 和 uninstall() 两个方法必须实现;
portalSearchBeforeArticle() 这个方法就是 钩子调用的方法,业务逻辑可以在此方法里实现;
在这里我只简单的判断了 前台用户是否登录过,没有登录则提示,这里可以换成跳转到登录页面;
这个简单的插件文件就已经写好;此时在ThinkCMF的后台菜单,插件中心->插件列表 即可看到,刚刚在文件里定义的插件名称;此时点击“安装”即可,提示安装完成,这样就安装成功自己的插件了。
那安装成功后如何使用呢?
文章开头就已经说明了,是需要在首页搜索 前使用这个 钩子的 portalSearchBeforeArticle(),那就找到搜索功能这个控制器,文件路径:/app/portal/controller/SearchController.php
找到 index() 这个方法,在方法的第一行添加:
//添加搜索前的钩子也就是行为 $content = hook_one('portal_search_before_article'); if (!empty($content)) { return $content; }
hook_one函数就是 添加钩子(行为)的动作,里面的参数就传递 自己添加的插件里的portalSearchBeforeArticle() 方法名称,注意:这里的驼峰式命名都要改成 _ 这个符号;
这样在执行搜索的时候,就会先执行 自己定义的钩子函数了。这样就达到了插件化;当然这只是非常简单的插件,但是基本流程就是这样走的。
有些情况可能出现,在文件添加了新方法,为什么使用的时候无效?那就需要在后台的插件管理里,“更新”该插件了。
更新完成后,可以在数据库里确定一下是否有新的 钩子添加成功:
当数据表 cmf_hook_plugin 字段 hook 里 有自己定义的方法名,这样即可在其他地方使用 改函数了;
当然
Dcr163的博客
https://www.dcr163.cn/199.html(转载时请注明本文出处及文章链接)