Codeigniter中的Composer阻止MY_控制器加载

时间:2013-12-10 11:47:53

标签: php codeigniter composer-php

在我的Codeigniter项目中经历了设置作曲家的痛苦后,我把它放在:

  require_once "./vendor/autoload.php";

进入我的index.php文件。将所有内容上传到服务器后,我收到错误消息,指出在main.php控制器中找不到MY_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论坛上提出了建议,但也没有解决问题......

3 个答案:

答案 0 :(得分:0)

不确定发生了什么事,但我第一次尝试时似乎记得类似的东西。我现在总是把:

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

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

在我的index.php文件的最顶层,在其他任何地方之前,它总是顺利运行

答案 1 :(得分:0)

您只能拥有一个__autoload功能,并且与使用spl_autoload_*功能完全相同,就像documented in the PHP.net page一样。

  

提示 spl_autoload_register()为自动加载类提供了更灵活的替代方法。因此,不鼓励使用__autoload(),将来可能会弃用或删除。

来自http://php.net/spl_autoload_register

  

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

现在解决方案非常简单:使用Composer的自动加载功能。您所要做的就是在现有的composer.json文件中添加新密钥“autoload”。如果您的代码符合PSR-0标准,则可能有效:

"autoload": {
    "psr-0": {
        "MY\\" : "application/core/"
    }
}

这种变体在开发时是最省力的,因为可以立即找到新类。

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

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

这会强制您在每次添加新类或重命名时重新创建自动加载器,因为旧的类图将不知道在哪里找到它。

查看Composer的文档。 BasicsDetails

请注意,我发现您自己的自动加载功能有点奇怪。您说的是,对于每个不以其名称中的“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不兼容。

答案 2 :(得分: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中。现在,composer将负责加载应用程序/核心文件夹中的文件。

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

最后,这非常重要,在作曲家中转储自动加载。

composer dump-autoload

现在应该可以了。