Codeigniter 4-在助手函数中获取实例



如何在ci4实例中进入helper函数$CI=&get_instance((<-那是在版本3中,在版本Codeigniter 4中如何?

I提供了一个要点。这里有一种方法。

  1. 创建一个辅助文件,您可以随心所欲地命名它
  2. 将以下代码添加到您刚刚创建的辅助对象中

助手文件的内容:即:utility_helper.php

<?php
$CI_INSTANCE = [];  # It keeps a ref to global CI instance
function register_ci_instance(AppControllersBaseController &$_ci)
{
global $CI_INSTANCE;
$CI_INSTANCE[0] = &$_ci;
}

function &get_instance(): AppControllersBaseController
{
global $CI_INSTANCE;
return $CI_INSTANCE[0];
}
  1. 基本控制器开始时呼叫register_ci_instance($this)

  2. 现在你可以在任何你想要的地方使用get_instance(),就像CI3:$ci = &get_instance()一样

我想提到的三个注意事项

  • 我只在PHP8上进行了测试
  • 我不确定在呼叫get_instance时是否需要&。但是,您可以选择使用任何您想要的表单。所以呼叫$ci = get_instance()也可以,但您可以随心所欲地呼叫$ci = &get_instance()
  • 确保将AppControllersBaseController更改为适当的值(即:您的基本控制器(。类型暗示非常好,因为IDE能够理解它们

创建一个公共帮助程序来保存控制器实例。假设这里是common_helper.php

$CI4 = new AppControllersBaseController;
function register_CI4(&$_ci)
{
global $CI4;
$CI4 = $_ci;
}

在您的BaseController

public $user_id;
protected $helpers = ['form', 'url', 'common']; // Loading Helper
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
register_CI4($this); // Registering controller instance for helpers;
$this->user_id = 4;
}

现在,您将在所有其他助手中获得控制器实例。假设一个新的heperuser_helper作为

function show_user_id()
{
global $CI4;
echo $CI4->user_id; // Showing 4
}

我在PHP Version: 8.0.6中进行了测试

对我来说,这是最好的解决方案:

if (!function_exists('getSegment'))
{
/**
* Returns segment value for given segment number or false.
*
* @param int $number The segment number for which we want to return the value of
*
* @return string|false
*/
function getSegment(int $number)
{
$request = ConfigServices::request();
if ($request->uri->getTotalSegments() >= $number && $request->uri->getSegment($number))
{
return $request->uri->getSegment($number);
}
else
{
return false;
}
}
} 

来源:https://forum.codeigniter.com/thread-74755.html

我得到了它(使用CodeIgniter4(:

控制器中:

helper('login');      
$isLog=isLogged($this,"user","passwd");
if($isLog)
....
else
....

助手中:

use AppModelsLoginmodel as Loginmodel;
function isLogged($ci,$e,$c){
$ci->login = new Loginmodel;
$ci->login->Like('paassword',$c);
$id=$ci->login->select('id')->where('username',$e)->findAll();
return $id;
}

我希望这能有所帮助。

在CI4中,只需使用以下内容:

$db = model('YourModel');

相关内容

  • 没有找到相关文章

最新更新