繁体   English   中英

Codeigniter:视图访问会话的最佳实践

[英]Codeigniter: Best practice for View accessing session

从我阅读的内容来看,View应该尽可能简单。

在视图中访问会话变量是否是一种好习惯?

即。

// in the view
<?php if ($this->session->userdata('is_logged_in') : ?>
  // stuff

<?php endif; ?>

实际问题的直接答案很简单:是的,可以在视图内部访问会话变量。 因为会话还是常规的,所以它们就是变量。 存储信息的地方。

我经常使用$this->session->flashdata在标头内的视图的定义区域中显示消息来执行此操作。

我之所以这样说,是因为其他人似乎跳过了您的实际问题,而得出“为什么”这样的问题:“哪里是检查身份验证的最佳位置?” 对于Cadmus的回答,这也是我处理该问题的正确方式,但是再次,不要认为您不应该从视图中访问会话“数据”,但是肯定要在Controller级别检查身份验证。

如果您不想在视图中放入这种“逻辑”(IMO很好),则需要在控制器中。 这样,视图本身也将变得更干净:

<?php if($logged_in): ?>
do stuff
<?php else: ?>
do different
<?php endif; ?>

$ logged_in来自完成所有会话工作的视图。 您可以编写自己的控制器(从CI控制器扩展),以便这些类扩展您的控制器,也可以将其抽象为具有某些静态方法的单独的Session类。 我认为,如果您进行大量会话处理,则使用自己的逻辑扩展CI控制器似乎是最干净的方法。

如果您过多使用此变量,则可以使用帮助器。 您可以像这样访问它:

<?php if (is_logged_in()) : ?>
     <!--your html code -->
<?php else ?>
     <!--more html code -->
<?php endif;?>

然后在您的帮助器中(称为access_helper),例如:

<?php
      function is_logged_in() { 
        return $this->session->user_data('is_logged_in');
      }
?>

我不确定最佳做法,但我想提供处理会议和视图的方法。 我将会话数据检查用户是否登录到控制器的构造函数。

然后我会自动进行会话验证,即从该控制器加载的页面正在自动获取会话封面。

 public function __construct() {
    parent::__construct();
    if (!$this->session->userdata('user_data')) {
        return redirect('login');
    } else {
               redirect('dashboard');
           }

    $this->load->model('customer_model');
}

以及成功或失败消息的视图,我使用闪存数据。

private function _falshAndRedirect($successful, $successMessage, $failureMessage) {
    if ($successful) {
        $this->session->set_flashdata('feedback', $successMessage);
        $this->session->set_flashdata('feedback_class', 'alert-success');
    } else {
        $this->session->set_flashdata('feedback', $failureMessage);
        $this->session->set_flashdata('feedback_class', 'alert-danger');
    }
    return redirect('customer/view_customer');
}

在这里,我使用私有函数将消息发送到视图。

然后创建函数,这些函数将自动获得“会话的覆盖”。

希望这会有所帮助。

从助手访问会话变量是不可能的。 最简单的是从视图访问会话变量。

<?php if ($this->session->user_data('is_loggen_in'): ?>
    <!-- HTML stuff -->
<?php endif; ?>

我认为这不会影响MVC模式的哲学,因为该会话是全球性的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM