欢迎光临 Rick 's BLOG
日志首页  | C# .Net编程  | 原创作品  | 生活点滴  | C\C++相关  | 多媒体相关※ERMP  | VB相关  | 其它运维与编程  |  留言簿
在PHP程序中实现安全的用户密码保存-加密存储和登录验证 在CodeIgniter4中集成谷歌验证码 reCaptcha V2
晴天  CodeIgniter4中如何在view或者helper函数中访问当前控制器对象
[ 发布日期:12个月前 (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 nullbool $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 于 12个月前 (12-03) 编辑]
[ 分类:原创作品  | 查看:1122 ]

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

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