【问题标题】:Codeigniter: HELPERS and $CI =& get_instance();Codeigniter: HELPERS 和 $CI =& get_instance();
【发布时间】:2012-11-20 00:04:06
【问题描述】:

我有一些函数可以管理控制器文件中某些控制器的访问级别。

我决定把它们带到图书馆或帮手那里。

由于它们主要是程序性的,我决定使用助手。

这是控制器文件中的原始方法(其他是access_level_member,access_level_moderator等)

  function access_level_admin() {

    if (!$this->session->userdata('loggedin')) {
        $this->session->set_flashdata('warning', 'Not logged in.');
        redirect('/start_page', 'refresh');
    }
    if (!$this->session->userdata('admin')) {
        $this->session->set_flashdata('warning', 'Access Denied!');
        redirect('/start_page', 'refresh');
    }  

这里有一个助手。

function access_level_admin() {
    $CI =& get_instance();
    if (!$CI->session->userdata('loggedin')) {
        $CI->session->set_flashdata('warning', 'Not logged in.');
        redirect('/start_page', 'refresh');
    }
    if (!$CI->session->userdata('admin')) {
        $CI->session->set_flashdata('warning', 'Access Denied!');
        redirect('/start_page', 'refresh');
    }  

所以我的问题是,将它放在库或助手中是更好的主意吗?可以使用 $CI =& get_instance();在助手中。

有更好的想法或建议吗?

【问题讨论】:

  • 我会将它们放在库(或模型)中,因为它们不是“辅助函数”——它可以帮助你做某事——但这些函数对你的应用程序至关重要——我会放置它们在某些身份验证库或身份验证模型中。至于在帮助程序中使用 get_instance() ,这是非常强制性的,因为您无权访问那里的 CI 超级对象(没有 $this 可用)
  • @Damien Pirsy 我尊重推理,但是如果您的应用程序依赖于帮助程序,那么帮助程序在任何应用程序中都与库一样重要。例如,我使用 form_helper 构建表单。现在,我将助手视为放置函数的地方,这些函数或多或少相互独立,并且不需要使用对象。不过我可能是错的。还要感谢 get_instance() 的澄清。
  • 我同意@Damien Pirsy。我会把它们放在某种User 模型中。 $user->isAdmin() 可读、简单、直接。
  • 如果你问我,这种功能属于 MY_Controller 甚至 MY_Session。这不是数据库功能,所以我个人没有在模型中看到它,并且您希望每次加载页面时都调用它,老实说,我真的不明白它属于模型的 cmets。
  • @Rick Calder 即使 CodeIgniter 建议使用模型作为数据库交互类,我也不这么认为。我更喜欢将模型视为业务逻辑的持有者。在我看来,用户是网站业务的一部分。这也是我作为评论而不是作为答案发布的原因。这是一种意见,我认为没有明确的答案。 (除了$CI 部分;正如已经回答的那样。)希望这可以帮助您理解我为什么要为它创建一个模型。 :)

标签: php codeigniter libraries helpers controllers


【解决方案1】:

我会将逻辑放在父控制器中并让您的控制器扩展它。

class Authenticated_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        if (!$this->session->userdata('loggedin')) {
            $this->session->set_flashdata('warning', 'Not logged in.');
            redirect('/start_page', 'refresh');
        }
}

class Admin_Controller extends Authenticated_Controller {
    public function __construct() {
        parent::__construct();
        if (!$this->session->userdata('admin')) {
            $this->session->set_flashdata('warning', 'Access Denied!');
            redirect('/start_page', 'refresh');
        }
}

【讨论】:

  • 感谢您的回答。所以我应该用我的控制器扩展 Authenticated_Controller 吗?另外,我将如何让人们访问该控制器(经过身份验证的和管理员等)?尽管这很有趣,但我认为它会使事情复杂化,但我的意思是某些控制器不需要登录部分,因为您可以在没有任何访问限制的情况下看到该页面。我将如何进一步研究这种可能性。
  • 您可以创建一个扩展CI_ControllerFront_ControllerFront_Controller 不会执行任何身份验证。正如@Damien Pirsy 建议的那样,您可以将身份验证逻辑放在身份验证库中。 Authenticated_Controller 将调用身份验证库。在某些情况下,您的控制器中的某些功能需要身份验证,而有些则不需要。您可以让该控制器扩展 Front_Controller 并仅在那些需要身份验证的函数中调用身份验证库。
  • 这是一个很好的答案,也是我用来验证我的管理页面的确切方法。身份验证不应在帮助程序中。
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2015-10-05
  • 2017-10-29
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
相关资源
最近更新 更多