簡體   English   中英

Codeigniter 4 - 在助手 function 中獲取實例

[英]Codeigniter 4 - get instance in helper function

我怎樣才能將 ci4 實例放入助手 function? $CI =&get_instance(); <- 那是在版本 3 中,這個 go 在版本 Codeigniter 4 中如何?

為此做了一個要點。 這是一種方法。

  1. 創建一個幫助文件,您可以隨意命名。
  2. 將以下代碼添加到您剛剛創建的助手中。

幫助文件內容:即:utility_helper.php

<?php

$CI_INSTANCE = [];  # It keeps a ref to global CI instance

function register_ci_instance(\App\Controllers\BaseController &$_ci)
{
    global $CI_INSTANCE;
    $CI_INSTANCE[0] = &$_ci;
}


function &get_instance(): \App\Controllers\BaseController
{
    global $CI_INSTANCE;
    return $CI_INSTANCE[0];
}
  1. 在你的基礎 controller的最開始調用register_ci_instance($this)

  2. 現在你可以像 CI3 一樣在任何你想要的地方使用get_instance()$ci = &get_instance()

我想提三個注意事項

  • 我只在PHP8上測試過。
  • 我不確定在調用get_instance時是否需要& 但是,您可以選擇使用任何您想要的形式。 所以調用$ci = get_instance()也可以,但你可以根據需要調用 $ $ci = &get_instance()
  • 確保將\App\Controllers\BaseController為適當的內容(即:您的基礎 controller )。 類型提示很棒,因為 IDE 可以理解它們。

我明白了(使用 CodeIgniter4):

controller中:

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

if($isLog)
  ....
  else
  ....

助手中:

use App\Models\Loginmodel 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;
}

我希望這有幫助。

創建一個通用助手來保留 controller 實例。 假設這里是common_helper.php

$CI4 = new \App\Controllers\BaseController;

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;
}

現在您將在所有其他助手中獲得 controller 實例。 假設一個新的 heper user_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 = \Config\Services::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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM