CodeIgniter - 在控制器中使用助手无法正常工作

6
我需要在多个控制器中使用一个函数。 所以我考虑使用自定义助手,但是好像不能让它工作。(它在视图中起作用,但我需要它在控制器中)
它给我以下致命错误:
致命错误:在/application/controllers/developers.php的第12行中调用未定义的方法Developers ::checkIfLoggedIn()
在多个控制器中使用助手来使用函数是否明智,还是应该采取其他方法呢?
谢谢你!
编辑:
控制器文件:
if (!defined('BASEPATH')) exit('No direct script access allowed');

class Developers extends CI_Controller
{
    public function __construct()
    {
         parent::__construct()
         $this->load->helper('form');
         $this->load->helper('url');
         $this->load->helper('login');

         //helper function
         checkIfLoggedIn($this->session->userdata('loggedIn'));
    }
}

助手文件:
if (!defined('BASEPATH')) exit('No direct script access allowed');

if (!function_exists('checkIfLoggedIn'))
{
    function checkIfLoggedIn($session_loggedIn)
    {
        $loggedIn = $session_loggedIn;
        if($loggedIn == false)
        {
            redirect('login/');
        }
    }
}

}


2
我曾经遇到过同样的问题,我创建了一个基础控制器,并在每个控制器中扩展了该函数,因为助手是为视图而设计的。 - EaterOfCode
好的,谢谢。我想我会这样做。 - DijkeMark
@EaterOfCorpses,helpers 不仅适用于 views,你也可以在控制器中使用它们。点击这里阅读 - The Alpha
1
@SheikhHeera 对不起,我以为Zend和CodeIgniter中的系统是相同的。 - EaterOfCode
我在我的编辑器中尝试了你的代码,它完全正常工作。你在config/autoload.php中自动加载了你的helper吗?DijkeMark - Roshimon
显示剩余2条评论
5个回答

19

在您的控制器中,您使用它的方式不正确,它不是控制器的方法,因此您不能使用$this来调用它。

帮助程序可以在控制器函数中的任何地方加载(甚至在视图文件中,尽管这不是一种好的做法),只要您在使用之前加载即可。您可以在控制器构造函数中加载您的帮助程序,以便它们自动在任何函数中可用,或者您可以在需要它的特定函数中加载帮助程序。

要加载帮助程序,您可以使用:

$this->load->helper('name'); // name is the name of the file without extention
与CodeIgniter中的大多数其他系统不同,Helper未按面向对象的格式编写,而是简单的过程式函数。每个Helper函数执行一个特定任务,不依赖于其他函数。
因此,在控制器中调用Helper函数时,不应使用
$this->function_name();

改用

function_name();
例如,如果你有一个位于helper文件中的帮助函数叫做myCustomHelper.php,如下所示。
function myHelper()
{
    // code
}

然后您可以在控制器中加载它,并按以下方式调用它

$this->load->helper('myCustomHelper');
myHelper(); // call the function

最好在构造函数中加载helpers,这样它将在整个脚本中可用。

更新: 如果您的帮助文件名为 login_helper.php,则可以在控制器中使用它如下:

$this->load->helper('login_helper');
checkIfLoggedIn($this->session->userdata('loggedIn'));

点击此处了解更多.


我尝试使用 $this-> 调用函数,但仍然找不到该函数。 - DijkeMark
@DijkeMark,不,你不应该使用$this来调用函数,而是直接使用函数名,例如myFunctionName(); - The Alpha
很抱歉,那是我想表达的。 :) 我打错了,但我的意思是没有。然而,它仍然找不到我的函数。 - DijkeMark
抱歉,我应该早点发布的。我已经编辑了我的主贴。 - DijkeMark
@DijkeMark,你加载了助手文件放在哪里?我只能看到加载了两个助手文件(表格和网址),但没有你的自定义助手文件。你的助手文件名是什么? - The Alpha
显示剩余5条评论

4

好的,我知道这个问题已经在5个月前被问过了,但也许有些人会发现这很有用。我刚刚遇到了同样的问题,并发现我的帮助函数的文件名是CodeIgniter已经使用的文件名。

因此,如果您没有收到警告:“无法加载请求的文件”,而是收到警告:“致命错误:调用未定义的函数[function_name]”,那么您可能正在使用一个本地已经存在的文件名。


1
你真是个传奇。我刚遇到这个问题,你可能为我节省了数小时的时间:D - Thomas Wood

1
Helpers是在Codeigniter中声明全局函数的理想方式,你所做的是正确的。以下是一些帮助提示:
  • 通过单行加载所有helpers而不是分开加载。
  • $this->load->helper('form');
    $this->load->helper('url');
    $this->load->helper('login');
    $this->load->helper(array('form','url','login'));
    
  • 如果您想使它在所有控制器文件中全局使用,那么可以将其放在位于'config/'目录下的autoload.php文件中。 请更新$autoload['helper']变量如下:
  • $autoload['helper'] = array('url','site');

来源:如何在CodeIgniter中创建和调用全局PHP函数


0

关于相关事项:在构造函数中放置 $this->load 时要小心:在 PHP 中,您必须显式调用 parent::__construct(); 否则父构造函数将不再被调用,导致 $this->load 未定义。上述解决方案可以正确处理此问题,但很容易忽略。

class My extends CI_Controller {
public function __construct() { 
parent::__construct();
$this->load->helper('url'); }

如果你不这样做,你会收到错误信息,My::$load不存在,助手将无法加载。


0

相反地,创建一个库类并在其中定义您的函数。然后在控制器中加载库并调用库的函数。您可以在任何控制器中加载库并使用其方法。


CI(CodeIgniter)中,可以在控制器中使用助手CodeIgniter helpers - The Alpha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接