欢迎光临 Rick 's BLOG
日志首页  | C# .Net编程  | 原创作品  | 生活点滴  | C\C++相关  | 多媒体相关※ERMP  | VB相关  | 其它运维与编程  |  留言簿
C#等效于php的password_verify 和 password_hash 功能的函数实现 介绍一个C#的javascpript引擎 Jurassic
晴天  CodeIgniter4中如何在view或者helper函数中访问当前控制器对象
[ 发布日期:3年前 (2023-11-30) ]   [ 来自:本站原创 ] [分类:原创作品]
在CodeIgniter4中我们如果将一些共通的基础数据保存到了当前控制器实例中。
就有可能会遇到需要在view视图中访问当前控制器实例的情况(需要访问基础数据)。
也有可能会需要在helper辅助函数中访问当前控制器实例。

这里我们可以通过扩展核心库的方式实现。

首先,我们扩展CodeIgniter\CodeIgniter 类来记录当前控制器实例,并提供访问接口
 实现代码如下(当前代码还包含了之前文章介绍的 SQL执行数量功能的实现)

[复制到剪贴板]
namespace App\Libraries;
use
CodeIgniter\Events\Events;
use
CodeIgniter\CodeIgniter as BaseCodeIgniter;
/**
* 扩展核心类实现 SQL 执行数的统计功能
* 提供当前控制器实例访问接口
*/
class CodeIgniter extends BaseCodeIgniter
{
/**
* @var int|null 变量SQL执行次数
*/
protected $sql_queries = 0;
/**
* 当前的控制器对象实例
*/
private $current_Control = null;
/**
* 函数 统计SQL执行次数
*/
public function collectDBQuery($query){
$this->sql_queries++;
}

public function
initialize(){
parent::initialize();
//增加扩展初始化代码 注册SQL统计函数
Events::on('DBQuery', [$this, 'collectDBQuery']);
}
/**
* 增加替换 sql_queries 标签
*/
public function displayPerformanceMetrics(string $output): string
{
// 替换 sql_queries 标签
$output = str_replace('{sql_queries}', $this->sql_queries, $output);
return
parent::displayPerformanceMetrics($output);
}
/**
* 保存当前的Controller实例对象
* @return Controller
*/
protected function createController()
{
$this->current_Control = parent::createController();
return
$this->current_Control;
}
/**
* 增加接口函数,获取当前控制器实例
*/
public function getCurrentControl(){
return
$this->current_Control;
}
}
?>


然后通过服务配置文件,将我们扩展的核心类注册到系统中
需要修改的文件是 App\Config\Services.php
在文件中添加如下函数,完成注册:
[复制到剪贴板]
/**
* 扩展 CodeIgniter核心类
* @return CodeIgniter
*/
public static function codeigniter(?App $config = null, bool $getShared = true)
{
if (
$getShared) {
return static::
getSharedInstance('codeigniter', $config);
}

$config ??= config(App::class);

return new
\App\Libraries\CodeIgniter($config);
}
?>



最后是访问方式
首先在 app\Common.php 中添加全局的辅助函数:
[复制到剪贴板]
/**
* 获取当前的控制器实例
*/
function currentControl(){
$app = Config\Services::codeigniter();
return
$app->getCurrentControl();
}
?>


然后你就可以通过全局函数 currentControl 在任意位置访问当前控制器实例了。
如果文章对您有帮助,给个赞赏吧!
引用通告地址 (0):
复制引用地址https://www.rickw.cn/trackback/278
复制引用地址https://www.rickw.cn/trackback/278/GBK
[本日志由 rick 于 3年前 (2023-12-03) 编辑]
[ 分类:原创作品  | 查看:2893 ]

暂时没有评论,快来发表一个评论吧。
发表评论
作者:   用户:[访客] 
评论:

表  情
禁止表情 | 禁止UBB | 禁止图片 | 识别链接
对不起,你没有权限上传附件!
验证:
 
PoweredBy R-Blog V1.00 © 2004-2026 WWW.RICKW.CN, Processed in second(s) , 5 queries    京ICP备17058477号-5