Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 控制器上使用的Codeigniter全局数据_Php_Twitter Bootstrap_Codeigniter - Fatal编程技术网

Php 控制器上使用的Codeigniter全局数据

Php 控制器上使用的Codeigniter全局数据,php,twitter-bootstrap,codeigniter,Php,Twitter Bootstrap,Codeigniter,简单介绍一下,我正在尝试制作一个用于发布故事和查看故事的web应用程序 我把我的控制器分为两部分,故事控制器和用户控制器。我写的任何函数都涉及到我项目的故事部分,我把它写在故事控制器中,我拥有的任何用户函数都在用户控制器中 例如: 公共函数add_story{}位于story controller中 公用函数寄存器{}位于用户控制器中 此外,在加载视图时,我将它们分为模板和页面 内部模板是页眉/导航栏/页脚。这些页面都是我的html的内容,所以只有页面不同 $this->load->

简单介绍一下,我正在尝试制作一个用于发布故事和查看故事的web应用程序

我把我的控制器分为两部分,故事控制器和用户控制器。我写的任何函数都涉及到我项目的故事部分,我把它写在故事控制器中,我拥有的任何用户函数都在用户控制器中

例如:

公共函数add_story{}位于story controller中

公用函数寄存器{}位于用户控制器中

此外,在加载视图时,我将它们分为模板和页面

内部模板是页眉/导航栏/页脚。这些页面都是我的html的内容,所以只有页面不同

$this->load->view('template/header');
$this->load->view('template/navbar');
$this->load->view('pages/page_name');
$this->load->view('template/footer');
现在我的问题在导航栏上。我想添加一个通知功能。我脑子里已经有了它,我只需要实施它,但我还不确定如何实施它。显然,我需要函数是全局的,否则我必须向控制器的所有函数声明它。这只会使我的代码变得更长,更难理解

我将创建一个名为notification的数据库表。状态为基本列,只有2个可能变量为“已看到”“未看到”。因为我有一个用户,他有两个角色author和reader,一个是作者提交给文章的任何新评论,另一个是读者添加到书架/书签故事的任何新章节

无论如何,我想做一个全局函数来解析表中最近5次登录的用户的所有更新,并在我的导航栏上的下拉列表中打印它们,然后在html中设置一个php if语句,无论它是否不可见,是否突出显示它。粗略的想法,稍后在实现过程中调整

我的问题是,我想实现这一点的第一种方法是使用构造函数或索引函数到我的控制器,并将数据存储在全局$data=array'notification'=>数组中;变数

然后我搜索了谷歌,找到了另一种方法,那就是使用base_控制器。我还没有在我的控制器中实现检查用户是否登录。我可以在构造函数中和通知一起执行此操作,但我也可以使用基本控制器执行此操作,对吗

无论如何,我想问一下,这两种方法中哪一种更好?我更倾向于第二种,但我可能是错的和/或是否有更好的方法?

没有必要在CodeIgniter中使用global。例如,如果您想获得通知,只需创建一个名为notification_model的模型并自动加载即可。然后,在任何控制器中,$this->notification\u model->get\u通知将可用,例如。或者在模型类构造函数中,您可以执行以下操作:

public $data = array();

public function __construct() {
    parent::__construct();
    $this->data = $this->get_notifications();
}
与$this->notification\u model->get\u notifications类似,this->notifications\u model->数据将在全球范围内可用

现在,就基本控制器而言,实际上应该称为MY_控制器,您认为为所有需要授权的控制器扩展修改后的CI_控制器是一个好主意,这是正确的

本文充分论述了此类方案:

我倾向于避免将身份验证代码放在my_控制器中,而是选择像$this->Auth_util->protectarray'user',editor'这样的函数;如果未登录,则重定向至登录;如果在顶部的每个函数调用中不允许用户组访问函数,则显示403,尤其是在处理仅属于某些用户组的函数时。可以通过在MY_控制器中检测到uri_段来处理这个问题,但是您需要控制器/函数和组权限的硬编码列表,所以我更喜欢我的方法

话虽如此,在MY_控制器中定义并分配给公共财产的任何内容也可以在全球范围内使用

// /application/core/MY_Controller.php
class MY_Controller extends CI_Controller {

    public $notifications;

    public function __construct() {
        parent::__construct();
        if ($this->is_logged_in()) {
            $this->get_notifications();
        } else {
            redirect('/login');
        }
    }

    public function is_logged_in() {
        return $this->session->has_userdata('user_id');
    }

    public function get_notifications() {
        $q = $this->db->get(...);
        $this->notifications = $q->result();
    }

}
用法:

class Some_controller extends MY_Controller {

    public function index() {
        print_r($this->notifications);
    }

}

我想你可以在那里创建helper put通知函数,现在你可以在controllerI中调用这个函数。我知道,但是与上面的那些函数相比,我认为创建一个单独的helper非常复杂?不是以复杂的方式,而是以迂回的方式?不管怎样,我认为为它建一个图书馆总比找一个助手好。我看到的每一个其他CI_插件都被制作成一个库。Idk我只是觉得这不是它的预期用途?我同样喜欢php/ci,因为它使用灵活,所以我想没有错误的方法,但它更容易接受。您只需创建帮助程序并自动加载它,这样您就可以在任何地方直接调用任何函数,然后我将使用My_controller方法。另外,仅仅使用现有的CI_插件进行身份验证,而不是制作自己的,这是一个更好的主意吗?是的!很高兴你这么问。许多人试图重新发明轮子。我个人使用Ion Auth。设置用户组非常容易。当安装ion auth插件时,它在安装指南上说运行适当的sql文件,但idk哪一个是适当的,因为sql目录中有3个sql文件,但我假设它是一个名为ion_auth.sql的文件?是的,其他的用于postgre或mssql
我想使用ion auth时,我应该记住哪些重要信息?