6

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

它给了我以下致命错误:

致命错误:在第 12 行的 /application/controllers/developers.php 中调用未定义的方法 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/');
        }
    }
}

}

4

5 回答 5

19

在您的控制器中,您以错误的方式使用它,它不是控制器的方法,因此您不能$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'));

在这里阅读更多

于 2012-08-15T09:26:05.360 回答
4

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

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

于 2013-01-31T18:45:42.373 回答
1

Helpers 是在 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');

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

于 2018-09-22T15:31:18.470 回答
0

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

于 2012-08-15T09:25:24.260 回答
0

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

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

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

于 2017-06-25T17:44:10.503 回答