就有可能会遇到需要在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 中添加全局的辅助函数:
然后你就可以通过全局函数 currentControl 在任意位置访问当前控制器实例了。
[复制到剪贴板] |
/**
* 获取当前的控制器实例
*/
function currentControl(){
$app = Config\Services::codeigniter();
return $app->getCurrentControl();
}
然后你就可以通过全局函数 currentControl 在任意位置访问当前控制器实例了。