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

时间:2012-08-15 08:43:50

标签: php codeigniter controller helper

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

它给了我以下致命错误:

  

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

使用助手在多个控制器中使用某个功能是一个聪明的举动,还是应该这样做。

先谢谢,
标记

修改
控制器文件:

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

}

5 个答案:

答案 0 :(得分:16)

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

  

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

要加载助手,您可以使用

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

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

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

$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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

关于相关问题:在__constructor中加载$ this->加载时要小心:在PHP中,你必须然后显式调用parent :: __ construct();否则不再调用父构造函数,留下$ this->加载undefined。上述解决方案是正确的,但它很容易被忽视。

  SetString(Result, Buffer, MySendMessageEx(AHandle, WM_GETTEXT, SizeOf(Buffer), Integer(@Buffer)));

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

答案 4 :(得分:0)

助手是在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