我在使用带有模块的 Codeigniter 的 HMVC 实现时遇到问题。
我创建了一个身份验证模块,称为autenticacion,出于显而易见的原因,为了检查会话的有效性和到期,它总是在MX_Controller中使用,这样:
Modules::run('autenticacion/logout', $user, true);
或者
Modules::run('autenticacion/update', $user);
取决于某些条件。
自从我添加了这个认证实现后,对其他模块的正常访问就被破坏了。
现在,例如,如果我尝试访问
www.domain.com/items
我编写了这个模块文件:
modules/items/controllers/Items.php
(这扩展了 MX_Controller) 和视图:
modules/items/views/items_view.php
尽管该视图已加载到 Items 控制器中,但仍找不到该视图。
如果我在 Items 构造函数中打印出 $this,则MY_Loader实例会显示此属性:
[_module:protected] => 认证
我理解这意味着项目模块没有被加载到加载器中,尽管我可以到达它的控制器。另一个模块(autenticacion)似乎把这一切搞砸了。
我该如何解决这个问题?
编辑:
这是我在MX_Controller中更改的内容,以便处理会话检查和更新:
<?
class MX_Controller
{
public $autoload = array();
public function __construct()
{
// Validación de la autenticación/caducidad de la sesión
$this->_validar_sesion();
// Original actions
//....
}
//... method __get()
/**
* Checks whether the user has not yet created a valid authenticated user session, or if it has expired.
* In both cases, it redirects to the authentication page, deleting the expired session if it was already created.
*/
private function _validar_sesion()
{
if (stristr(get_class($this), 'autenticacion')) return;
require_once APPPATH . 'third_party/usuarios/Usuario.php';
$this->load->model('autenticacion/autenticacion_model');
// Get user instance from session
$usuario = unserialize($this->session->userdata('usuario'));
// No authenticated session yet: redirecting to the authentication page
if (!stristr(current_url(), 'autenticacion') && ! $this->session->logged_in) {
$this->load->library('uri');
$uri = $this->uri->uri_string();
redirect(base_url() . 'autenticacion' . ($uri ? '?redirect=' . $uri : ''));
}
// There is already an authenticated session, and the request is not coming from the authentication page
elseif (!stristr(current_url(), 'autenticacion')) {
// Check session expiration, in which case, we do logout
if ($this->autenticacion_model->sesion_caducada($usuario, config_item('sess_companyname_expiration'))) {
// This will delete the session from DB, destroy it, and redirect to the authentication page
Modules::run('autenticacion/logout', $usuario, true);
}
// Session has not expired yet: we update the session timestamp in DB to extend the expiration time
else {
Modules::run('autenticacion/update', $usuario);
}
}
}
}