【问题标题】:Codeigniter Global data to be used on controllers控制器上使用的 Codeigniter 全局数据
【发布时间】:2018-02-07 04:06:45
【问题描述】:

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

我将我的控制器分为两个,故事控制器和用户控制器。我编写的任何涉及我项目的故事部分的功能我都在故事控制器中编写,我拥有的任何用户功能都在用户控制器中。

例如:

公共函数 add_story(){} 在故事控制器中。

公共函数 register(){} 在用户控制器中。

在加载我的视图时,我将它们分成模板和页面。

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

$this->load->view('template/header');
$this->load->view('template/navbar');
$this->load->view('pages/page_name');
$this->load->view('template/footer');

现在我的问题在导航栏中。我想添加一个通知功能。我脑子里已经有了它,我只需要实现它,但我对如何实现它犹豫不决。显然我需要该函数是 GLOBAL 否则我必须将它声明给我的控制器的所有函数。这只会使我的代码更长且难以遵循。

我将简单地创建一个名为通知的数据库表。以基本列作为状态,只有 2 个可能的变量为“已见”“未见”。因为我有一个用户有两个角色(作者和读者),作者提交给发布的故事的任何新评论,以及读者添加到书架/书签故事的任何新章节。

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

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

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

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

【问题讨论】:

  • 我认为你可以创建助手把通知函数放在那里,现在你可以在控制器中调用这个函数
  • 我知道,但与上面的那些相比,我认为制作一个单独的助手只是很复杂?不是以复杂的方式,而是以一种迂回的方式?无论如何,我认为为它制作一个库比制作一个助手更好。我看到的所有其他 CI_plugin 总是被做成一个库。我只是觉得那不是它的预期用途?然后我再次喜欢 php/ci 的使用灵活性,所以我想没有错误的方法,但它更多的是更容易接受的。
  • 你只需创建助手并自动加载它,这样你就可以在任何地方直接调用任何函数

标签: php twitter-bootstrap codeigniter


【解决方案1】:

CodeIgniter 中无需使用global。例如,如果您想获得通知,您可以简单地创建一个名为 notification_model 的模型并自动加载它。然后,例如,在 any 控制器中,$this->notification_model->get_notifications() 将可用。或者在notification_model 类构造函数中你可以这样做:

public $data = array();

public function __construct() {
    parent::__construct();
    $this->data = $this->get_notifications();
}

$this->notification_model->get_notifications() 类似,$this->notifications_model->data 将在全球范围内可用。


现在就base_controller(确实应该称为MY_Controller)而言,您确实认为为所有需要授权的控制器扩展修改后的CI_Controller 是一个好主意。

这篇文章充分解决了这种方案:https://codeinphp.github.io/post/controllers-for-frontend-and-backend-in-codeigniter/

我倾向于避免将 Auth 代码放入我的 MY_Controller 中,而是在每个函数中选择像 $this->auth_util->protect(array('user', 'editor')); 之类的函数(如果未登录则重定向到登录,如果用户组不允许访问函数则显示 403)在顶部调用,尤其是在处理仅与某些用户组相关的功能时。可以通过在MY_Controller 中检测到uri_segment 来处理这个问题,但是你需要一个controller/functions 和组权限的硬编码列表,所以我更喜欢我的方法。

话虽如此,在您的 MY_Controller 中定义并分配给公共属性的任何内容也全局可用。

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

}

【讨论】:

  • 那我就使用 My_controller 方法。另外,使用现有的 CI_Plugin 进行身份验证而不是自己制作是否更好?
  • 是的!很高兴你问。很多人试图重新发明轮子。我个人使用 Ion Auth。设置用户组非常容易。
  • 在安装 ion auth 插件时,它在安装指南上说要运行适当的 sql 文件,但是由于 sql 目录中有 3 个 sql 文件,所以我想知道哪个是合适的,但我只是假设它是一个名为 ion_auth.sql 的?
  • 是的,我认为其他的都是 postgre 或 mssql
  • 在使用 ion auth 时我应该记住任何重要信息吗?
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多