Php Codeigniter中的Composer阻止加载MY_u控制器
在经历了在Codeigniter项目中设置composer的痛苦之后,我提出: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
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