codeigniter - 在控制器中使用帮助器不起作用

Posted

技术标签:

【中文标题】codeigniter - 在控制器中使用帮助器不起作用【英文标题】:codeigniter - using helper in controller doesn't work 【发布时间】:2012-08-11 13:46:58 【问题描述】:

我需要在多个控制器中使用一个函数。 所以我想使用自定义助手,但似乎我无法让它工作。 (它在视图中工作,但我需要在控制器中)

它给了我以下致命错误:

致命错误:调用未定义的方法 Developers::checkIfLoggedIn() in /application/controllers/developers.php 第 12 行

使用助手在多个控制器中使用函数是明智之举吗,还是应该不这样做。

提前致谢, 标记

编辑: 控制器文件:

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/');
        
    

【问题讨论】:

我遇到了同样的问题,我创建了一个具有该功能的基本控制器并在每个控制器中扩展了它,因为帮助程序用于视图 好的,谢谢。我想我会那样做 您是否自动加载了帮助程序?还是在控制器中,在你想使用它之前? @EaterOfCorpses,助手不仅适用于views,您也可以在控制器中使用它。 Read here. @SheikhHeera 对不起,我以为 Zend 和 CodeIgniter 中的系统是一样的 【参考方案1】:

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

可以在控制器函数中的任何位置加载帮助程序(或 即使在您的视图文件中,虽然这不是一个好习惯),如 只要您在使用之前加载它。你可以加载你的助手 您的控制器构造函数,以便它们可用 自动在任何函数中,或者您可以在特定的 需要它的函数。

要加载你可以使用的助手

$this->load->helper('name'); // name is the name of the file without extention

与 CodeIgniter 中的大多数其他系统不同,Helper 不是用 一种面向对象的格式。它们是简单的程序函数。每个 辅助函数执行一项特定任务,不依赖于 其他功能。

因此,要在控制器中调用辅助函数,您不应该使用

$this->function_name();

改为使用

function_name();

例如,如果您在名为myCustomHelper.php 的帮助文件中有一个帮助函数,如下所示

function myHelper()

    // code

然后你可以在控制器中加载它并调用它如下

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

但最好在构造函数中加载帮助器,这样它就可以在整个脚本中使用。

更新:如果您的帮助文件的名称是 login_helper.php,那么您可以在控制器中使用它,如下所示

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

Read more here.

【讨论】:

我尝试用$this->调用函数,但还是找不到函数 @DijkeMark,不,您不应该使用$this 调用函数,只需使用函数名称调用,即myFunctionName(); 对不起,我是这个意思。 :) 我同意了,但我的意思是没有。但是,它仍然找不到我的功能。 您是否使用$this->load->helper('filenamewithoutExt') 加载了帮助文件? 是的,我在构造函数中做到了。助手位于应用程序/助手中。人们所说的一切,我都做对了。奇怪的是它仍然找不到我的功能【参考方案2】:

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

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

【讨论】:

你绝对的传奇。刚刚遇到这个问题,你可能为我节省了几个小时:D【参考方案3】:

Helper 是在 codeigniter 中声明全局函数的理想方式,您所做的是正确的。以下只是对您有帮助的几点。

通过单行而不是单独的行加载所有帮助程序。

$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');

来源:How to create & call global PHP functions in CodeIgniter

【讨论】:

【参考方案4】:

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

【讨论】:

Helper 可用于CI CodeIgniter helpers 的控制器中。【参考方案5】:

关于一个相关问题:将 $this->load 放入 __constructor 时要小心:在 PHP 中,您必须随后显式调用 parent::__construct();否则不再调用父构造函数,而 $this->load 未定义。上面的解决方案做得对,但很容易被忽视。

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

如果您不这样做,您将收到错误消息 My::$load 不存在并且帮助程序将不会加载。

【讨论】:

以上是关于codeigniter - 在控制器中使用帮助器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 帮助 - 控制器中的活动记录和循环

如何在 CodeIgniter 中使用多个控制器?

需要帮助在 codeigniter 中创建自动填充

如何在 CodeIgniter 4 中使用子目录控制器?

哪个是安全的,使用一次 required 或在 codeigniter 的帮助程序中创建一个函数?

codeigniter 帮助在加载模型时导致错误