[英]Composer in Codeigniter prevents MY_ controllers from loading
在经历了在Codeigniter项目中设置作曲家的痛苦之后,我提出了这一点:
require_once "./vendor/autoload.php";
进入我的index.php文件。 将所有内容上传到服务器后,我收到一条错误消息,即在main.php控制器中找不到MY_Mainconroller(位于应用程序/核心中)。 由于某些奇怪的原因,作曲家的自动加载功能会破坏我的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文件的最顶部,之前没有任何其他内容,它始终运行平稳
您只能拥有一个__autoload
函数,并且与spl_autoload_*
函数是互斥的,正如PHP.net页面中记录的那样 。
提示 spl_autoload_register()为自动加载类提供了更灵活的替代方法。 因此,不建议使用__autoload(),以后可能不建议使用或将其删除。
从http://php.net/spl_autoload_register
如果您的代码具有现有的__autoload()函数,则必须在__autoload堆栈上显式注册此函数。 这是因为spl_autoload_register()将通过spl_autoload()或spl_autoload_call()有效替换__autoload()函数的引擎缓存。
现在,解决方案非常简单:使用Composer的自动加载功能。 您要做的就是在现有的composer.json
文件中添加一个新的键“自动加载”。 如果您的代码符合PSR-0标准,则可能会起作用:
"autoload": {
"psr-0": {
"MY\\" : "application/core/"
}
}
开发时,此变体的工作量最小,因为会立即发现新的类。
否则,您可以使用类映射:
"autoload": {
"classmap": ["application/core/"]
}
每次添加新类或重命名它时,这都会迫使您重新创建自动加载器,因为旧的类映射将不知道在哪里可以找到它。
请注意,我发现自己的自动加载功能有些奇怪。 您说的是,对于每个名称中不以“ 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博客完全相同的自动加载脚本,就像最初的问题一样,当我添加Composer位时,该脚本崩溃了。
首先,将其从index.php中删除(Phil Sturgeon位):
function __autoload($class)
{
if(strpos($class, 'CI_') !== 0)
{
@include_once( APPPATH . 'core/'. $class . EXT );
}
}
然后,将以下内容添加到index.php中,就在“ LOAD the BOOTSTRAP FILE”位之前。 这是作曲家的自动加载。
/*
* --------------------------------------------------------------------
* LOAD COMPOSER PACKAGES
* --------------------------------------------------------------------
*
*/
include_once './vendor/autoload.php';
将此添加到您的composer.json。 现在,作曲家将负责将文件加载到您的application / core文件夹中。
"autoload": {
"classmap": ["application/core/"]
}
最后,这非常重要,在composer中转储自动加载。
composer dump-autoload
现在应该可以工作了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.