Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter中的Composer阻止加载MY_u控制器_Php_Codeigniter_Composer Php - Fatal编程技术网

Php Codeigniter中的Composer阻止加载MY_u控制器

Php Codeigniter中的Composer阻止加载MY_u控制器,php,codeigniter,composer-php,Php,Codeigniter,Composer Php,在经历了在Codeigniter项目中设置composer的痛苦之后,我提出: require_once "./vendor/autoload.php"; 进入我的index.php文件。将所有内容上传到服务器后,我收到一条错误消息,在main.php控制器中找不到我的_Mainconroller(位于application/core中)。出于某种奇怪的原因,作曲家自动加载破坏了我的CI 我在config.php中使用此方法自动加载我的客户控制器扩展: function __autolo

在经历了在Codeigniter项目中设置composer的痛苦之后,我提出:

  require_once "./vendor/autoload.php";
进入我的index.php文件。将所有内容上传到服务器后,我收到一条错误消息,在main.php控制器中找不到我的_Mainconroller(位于application/core中)。出于某种奇怪的原因,作曲家自动加载破坏了我的CI

我在config.php中使用此方法自动加载我的客户控制器扩展:

 function __autoload($class)
 {
    if(strpos($class, 'CI_') !== 0)
    {
       @include_once( APPPATH . 'core/'. $class . EXT );
    }
 } 
它以前工作得很好。任何关于为什么会发生这种情况的指点都非常感谢

我修改了composer.json文件并添加了:

"autoload": {
    "classmap": ["application/core"]
}

这是CI论坛上提出的,但也没有解决问题

我不确定你身上发生了什么,但我似乎记得我第一次尝试它时有类似的事情。我现在总是说:

$vendor_path = './vendor/autoload.php';

if (file_exists($vendor_path))
{
   require $vendor_path;
} 

在我的index.php文件的最顶端,它总是平稳运行

您只能有一个
\uuu autoload
函数,它与使用
spl\u autoload\u*
函数是互斥的,就像它一样

提示spl_autoload_register()为自动加载类提供了更灵活的选择。因此,不鼓励使用_autoload(),将来可能会被弃用或删除

如果代码有一个现有的_autoload()函数,则必须在_autoload堆栈上显式注册此函数。这是因为spl_autoload_register()将有效地用spl_autoload()或spl_autoload_call()替换函数的引擎缓存

现在解决方案非常简单:使用Composer的自动加载功能。您只需在现有的
composer.json
文件中添加一个新键“autoload”。如果您的代码符合PSR-0标准,则这可能会起作用:

"autoload": {
    "psr-0": {
        "MY\\" : "application/core/"
    }
}
这种变体在开发时最省力,因为可以立即找到新类

否则,您可以使用类映射:

"autoload": {
    "classmap": ["application/core/"]
}
这将迫使您在每次添加新类或重命名它时重新创建自动加载程序,因为旧的类映射不知道在哪里可以找到它

请看一下Composer的文档

请注意,我发现您自己的自动加载功能有点奇怪。您的意思是,对于名称中不以“CI_”开头的每个类,您都包含一个文件。那么名称中其他地方有“CI_”的类呢?您正在大量尝试自动加载所有不以“CI_”开头的内容,无论它是否可以在您的目录中找到。正确的做法是只加载您知道自己负责的类,如下所示:

if(strpos($class, 'MY_') === 0) // starts with "MY_"
{
   require_once( APPPATH . 'core/'. $class . EXT );
}

请注意,PSR-0标准定义在不使用名称空间时,类名中的每个下划线都转换为目录分隔符。因此,如果您的类被命名为“MY_foo”,那么相对路径将是“MY/foo.php”,即“application/core/MY/foo.php”。如果您当前有“application/core/MY_foo.php”,则与PSR-0不兼容。

在修改composer.json后,您可能忘记运行“composer dump autoload”

下面是详细的步骤。请注意,我使用的是Phil Sturgeon的博客中完全相同的自动加载脚本,正如最初的问题一样,当我添加作曲家位时,脚本中断

首先,将其从index.php(Phil Sturgeon位)中删除:

然后,将以下内容添加到index.php,就在“加载引导文件”位之前。这是作曲家的自动加载

/*
 * --------------------------------------------------------------------
 * LOAD COMPOSER PACKAGES
 * --------------------------------------------------------------------
 *
 */
include_once './vendor/autoload.php';
将此添加到composer.json。现在,composer将负责加载应用程序/核心文件夹中的文件

"autoload": {
    "classmap": ["application/core/"]
}
最后,这一点非常重要,在composer中转储自动加载

composer dump-autoload

现在应该可以用了。

这对我不起作用。我了解到您必须修改composer.json文件以包含自动加载。我也试过了,但根本不行。非常感谢你详细的回答。然而,只有spl_自动加载_寄存器部分对我有效。我以前尝试过“类映射”方法,但没有任何效果。由于您怀疑的原因,psr-0方法对我不起作用。我使用的自动加载器功能是从Phil Sturgeon的博客中复制的。对于我来说,为什么“类地图”方法似乎对除我之外的所有人都有效,这仍然是一个谜。令人沮丧。你的常量
EXT
是如何定义的?定义('EXT','.php');它位于Codeigniter的index.php文件中。
composer dump-autoload