我刚刚开始学习CodeIgniter,我正在通过nettuts +关注this身份验证教程。我不明白其中的一件事:
他在Welcome控制器中添加了以下构造函数代码,只有在Session具有可变用户名时才能访问它,否则它将重定向到admin controller。
function __construct()
{
session_start();
parent::__construct();
if ( !isset($_SESSION['username'])){
redirect('admin');
}
}
他说:
如果你有多个控制器,那么 而不是添加上面的代码 每个控制器,你应该创建一个 新的图书馆,扩展了 你将把代码粘贴到控制器中, 并将库自动加载到 项目。这样代码运行 总是在加载控制器时。
是否意味着,我应该
if ( !isset($_SESSION['username'])){
redirect('admin');
}
现在如何自动加载这个库,并在每次加载控制器时使其运行,如他所说的那样? 感谢
答案 0 :(得分:5)
1)自动加载库,只需将其添加到文件application / config / autoload.php中的数组中,查找“库”部分并将库的名称(不带扩展名)粘贴到那里,作为元素数组。
$autoload['libraries'] = array ('auth');
2)我建议你使用原生会话处理程序(会话库),它运行得很好并且避免使用php $ _SESSION。您设置宽度$this->session->set_userdata(array('username' => 'User1', 'logged' => 'true')
,然后使用$this->session->userdata['logged']
检索值,例如。
像魅力一样工作,不必调用session_start()等。去检查帮助,因为它真的非常清楚。
3)至于你的问题,我会选择“钩子”。有不同的钩子,取决于他们的“位置”,即你打电话给他们的那一刻。
对于ex ..'post_controller_constructor',你可以使用它,它在控制器初始化之后但在方法之前被调用,因此它位于构造函数和实际方法之间。我通常在这里插入这些控件。
您在application / config / hooks.php中定义了钩子,并为它们提供了一个数组:
$hook['post_controller_constructor'] = array(
'class' => 'Auth',
'function' => 'check',
'filename' => 'auth.php',
filepath' => 'hooks',
'params' => array()
);
无论如何,对于所有这些需求,文档非常明确和直接,我建议你阅读钩子和会话,你会发现一切都变得更加清晰!
答案 1 :(得分:1)
将新库添加到config / autoload.php中的自动加载库数组中。
$autoload['libraries'] = array ('database', 'session', 'auth');
然后,当您想在控制器构造函数中调用该函数时,请使用$this->auth->function_name();
。
如果您不希望在每个构造函数中调用大量重复功能,则可能需要将其设为hook。
答案 2 :(得分:1)
另一种方法。这就是他在教程中的意思。
在MY_Controller
文件夹中创建一个名为application/libraries
的库,并从CI_Controller
扩展它:
Class MY_Controller extends CI_Controller {
public function __construct()
{
parent::__construct();
// do the stuff you want to execute on every page.
// like auth.
}
}
auth
配置文件中自动加载autoload.php
类。无需自动加载MY_Controller
CodeIgniter会自动识别并运行它。您还可以在Auth
MY_Controller
库
MY_Controller
课程扩展您的控制器。 (不是CI_Controller
)扩展控制器可以更好地控制您的项目。您可以添加额外的方法以在项目的任何位置使用。
有关扩展CodeIgniter的本机库的更多信息,请检查Creating Libraries: CodeIgniter。