繁体   English   中英

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

[英]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/"]
}

每次添加新类或重命名它时,这都会迫使您重新创建自动加载器,因为旧的类映射将不知道在哪里可以找到它。

看看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博客完全相同的自动加载脚本,就像最初的问题一样,当我添加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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM