列出Codeigniter搜索类的文件夹

时间:2017-09-22 16:02:17

标签: php codeigniter

Codeigniter找不到琐碎的类:

sinon

Unable to load the requested class: Bcrypt中的文件中定义的自定义类也是如此。我用的是django列出了搜索文件的文件夹,但没找到。显然,CI还必须遍历某些文件夹或文件列表,但不能像错误那样显示它们。

似乎CI有一个命名约定来推断它所期望的类的(文件集)文件名。如何以编程方式application/libraries/ Codeigniter或PHP尝试追踪此类的文件夹或文件名列表?

编辑:产生此类加载错误的代码行是:

error_log
<{1>}和

中的

$autoload['libraries'] = array('database','session','mi_file_fetcher');
application/config/autoload.php

中的

如评论中所述,我没有要求修复,我要求列表。

2 个答案:

答案 0 :(得分:0)

我设法通过更新system/core/Loader.php

来实现这一目标
protected function _ci_load_library_files_tried($class, $subdir, $params, $object_name)
{
    $files_tried = array(BASEPATH . 'libraries/' . $subdir . $class . '.php');

    foreach ($this->_ci_library_paths as $path) {
        if ($path === BASEPATH) {
            continue;
        }

        array_push($files_tried, $path . 'libraries/' . $subdir . $class . '.php');
    }
    return $files_tried;
}

protected function _ci_load_library($class, $params = NULL, $object_name = NULL)
{
// ... 

    // If we got this far we were unable to find the requested class.
    $files_tried = $this->_ci_load_library_files_tried($class, $subdir, $params, $object_name);

    log_message('error', 'Unable to load the requested class: '.$class .
        ", tried these files:\n" . join("\n", $files_tried));
    show_error('Unable to load the requested class: '.$class .
        ', tried these files:<ul><li>' . join('</li><li>', $files_tried) . '</li></ul>');
}

如果CI实际上提供了不错的调试信息,那将会很棒。

答案 1 :(得分:-1)

CodeIgniter(CI)文档会告诉您库,模型,帮助程序,视图和许多其他框架对象的默认位置。但是,没有明确列出文件夹的部分。 Loader Class文档会告诉您,但您必须稍微挖掘一下。

文档General Topics部分的子主题清楚地说明了框架使用的各种类的默认位置以及自定义类的放置位置。

在大多数情况下遵循规定的文件结构并使用加载器类,例如(Bcrypt.php位于/application/libraries/

$this->load->library('bcrypt'); 

完美无缺。

在CI需要帮助的情况下(似乎没有任何问题涉及您的问题)。在这些情况下,不是破解或扩展CI_Loader自动加载器是有用的。

有很多方法可以添加自动加载器,但我的偏好是使用CI Hooks功能。这是怎么回事。

config.php 中设置&#39; enable_hooks&#39;为TRUE

$config['enable_hooks'] = TRUE;

这些行进入 /application/config/hooks.php

$hook['pre_system'][] = array(
  'class' => '',
  'function' => 'register_autoloader',
  'filename' => 'Auto_load.php',
  'filepath' => 'hooks'
);

以下是 /application/hooks/Auto_load.php

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

function register_autoloader()
{
  spl_autoload_register('my_autoloader');
}

/**
 * Allows classes that do not start with CI_ and that are 
 * stored in these subdirectories of `APPPATH` 
 * (default APPPATH = "application/" and is defined in "index.php")
 *     libraries, 
 *     models, 
 *     core
 *     controllers
 * to be instantiated when needed.
 * @param string $class Class name to check for
 * @return void
 */
function my_autoloader($class)
{
  if(strpos($class, 'CI_') !== 0)
  {
    if(file_exists($file = APPPATH.'libraries/'.$class.'.php'))
    {
      require_once $file;
    }
    elseif(file_exists($file = APPPATH.'models/'.$class.'.php'))
    {
      require_once $file;
    }
    elseif(file_exists($file = APPPATH.'core/'.$class.'.php'))
    {
      require_once $file;
    }
    elseif(file_exists($file = APPPATH.'controllers/'.$class.'.php'))
    {
      require_once $file;
    }
  }
}

如果您愿意,可以在上面使用函数log_message($level, $message)

如果您使用其他一些广告素材文件夹结构,则必须修改上述内容以适应该布局。