Codeigniter要在控制器

时间:2018-02-07 04:06:46

标签: php twitter-bootstrap codeigniter

这是一个简短的介绍,我试图制作一个用于发布故事和查看故事的网络应用程序。

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

例如:

  

public function add_story(){}在故事控制器中。

     

public function register(){}在用户控制器中。

同样在加载我的观点时,我将它们分成模板和页面。

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

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

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

我只是创建一个名为notification的数据库表。将一个基本列作为状态,只有两个可能的变量,因为'看到' '看不见&#39 ;.由于我有一个用户有两个角色(作者和读者)为作者任何新的评论提交到故事发布和读者任何新的章节添加到bookshelved / bookmarked故事。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

无需在CodeIgniter中使用global。例如,如果您想获得通知,则只需创建一个名为notification_model的模型并自动加载即可。然后,在中,任何控制器$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/

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

话虽如此,您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);
    }

}