后控制器挂钩不会在 codeigniter 中未找到的控制器上抛出 404

Posted

技术标签:

【中文标题】后控制器挂钩不会在 codeigniter 中未找到的控制器上抛出 404【英文标题】:Post controller hook does not throw 404 on unfound controller in codeigniter 【发布时间】:2017-12-21 00:54:22 【问题描述】:

我在我的代码点火器应用程序中定义了一个钩子,用于根据加载的控制器加载语言。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files.  Please see the user guide for info:
|
|   https://codeigniter.com/user_guide/general/hooks.html
|
*/
$hook['post_controller_constructor'] = array(
    'class'    => 'LanguageLoader',
    'function' => 'initialize',
    'filename' => 'LanguageLoader.php',
    'filepath' => 'hooks'
);

这就是 LanguageLoader.php 的样子

<?php
class LanguageLoader

    function initialize() 
        $ci =& get_instance();
        $class = $ci->router->class;
        $class = strtolower($class);
        $ci->load->helper('language');
        $ci->load->library('session');
        if(!$ci->session->has_userdata('language'))
            $ci->session->set_userdata('language','english');
            $ci->session->set_userdata('language_remaining','spanish');
         
        $ci->lang->load($class,$ci->session->userdata('language'));
        $ci->lang->load('dashboard',$ci->session->userdata('language'));
    

这样做的问题是,如果我访问一个不存在的控制器的 URL,它只会抛出找不到语言文件而不是抛出 404 错误。如果我将钩子更改为预控制器,我应该得到 404 错误,但是在使用存在的控制器时语言文件不会自动加载。

解决此问题的首选方法是什么?检查一下控制器是否存在于钩子中?还是我唯一希望手动加载我的语言文件?

谢谢

【问题讨论】:

尝试重命名它,所以只有第一个字母是大写的 Languageloader 类和文件名 你尝试过其他的钩子点吗? @Tpojka 是的,后控制器构造函数是唯一合适的。 @wolfgang1983 这无济于事,因为我所有的语言文件都以完整的小写字母命名。我也不确定你的意思是什么 codeigniter.com/user_guide/general/styleguide.html#file-naming 【参考方案1】:

嗯,厌倦了等待和搜索。为什么要等,等我可以编写自己的解决方案时。

    <?php
class LanguageLoader

    function initialize() 
        $ci =& get_instance();
        $class = $ci->router->class;
        $class = strtolower($class);
        $ci->load->helper('language');
        $ci->load->library('session');
        if(!$ci->session->has_userdata('language'))
            $ci->session->set_userdata('language','english');
            $ci->session->set_userdata('language_remaining','spanish');
         
        $path = '_botadmin/language/'.$ci->session->userdata('language').'/'.$class.'_lang.php';

        if(file_exists($path))
            $ci->lang->load($class,$ci->session->userdata('language'));
            $ci->lang->load('dashboard',$ci->session->userdata('language'));
        
    

【讨论】:

为了让这个答案更好,我建议你添加一些文字来解释你提供的逻辑......

以上是关于后控制器挂钩不会在 codeigniter 中未找到的控制器上抛出 404的主要内容,如果未能解决你的问题,请参考以下文章

在 codeigniter 中未访问 home.php

Codeigniter v3.0 Flashdata 会话在 PHP 7.4 和 XAMPP 8.0 中未过期

Codeigniter - 在表单编辑中未显示数组时制作下拉菜单

.NET 应用程序中未调用低级键盘挂钩

Codeigniter:在 mac safari 中未检测到 vcf mime 类型

CodeIgniter 4 项目中未定义的常量“CodeIgniter\Database\MySQLi\MYSQLI_STORE_RESULT”