如何在CodeIgniter中使用Composer包?

26
我遵循了这篇文章:http://philsturgeon.co.uk/blog/2012/05/composer-with-codeigniter,但我收到了“致命错误:找不到类'Buzz\Browser'” 的错误信息。
他的文章中缺少什么?
我的控制器或应用程序没有命名空间。我希望只能在非命名空间的框架中的一个控制器操作中使用这个包。

你是否在使用自动加载器? - Wesley Murch
7个回答

52

对于CodeIgniter 3.x和composer,建议只需在application/config/config.php中设置$config['composer_autoload']TRUE或自定义路径即可(建议)

似乎CI假定vendor目录位于application目录内,但这不是我的情况。我进行了以下操作:

$config['composer_autoload'] = 'vendor/autoload.php';


40

感谢@jmadsen

只需正确加载顺序,就可以实现这一点:

/*
 * --------------------------------------------------------------------
 * LOAD THE BOOTSTRAP FILE
 * --------------------------------------------------------------------
 *
 * And away we go...
 *
 */
// Composer Autoloader
require FCPATH . 'vendor/autoload.php';

require_once BASEPATH.'core/CodeIgniter.php';

/* End of file index.php */

2
FrontController路径。基本上是index.php文件;如果我没记错的话,它位于根目录下。 - Tjorriemorrie
所以我需要将这个放入我的index.php文件中吗? - codingbruh
我将composer.json和vendor目录添加到应用程序文件夹中。因此,您需要使用:require APPPATH . 'vendor/autoload.php'; - Lord_Dracon

11

在Codeigniter3.x中,您可以轻松地通过进入application/config/config.php并查找此行来实现:

$config['composer_autoload'] = FALSE;

请确保将其设置为TRUE,然后紧接着使用require_once:

require_once APPPATH.'vendor/autoload.php';

这样你就可以得到像这样的东西:

/*
|--------------------------------------------------------------------------
| Composer auto-loading
|--------------------------------------------------------------------------
|
| Enabling this setting will tell CodeIgniter to look for a Composer
| package auto-loader script in application/vendor/autoload.php.
|
|   $config['composer_autoload'] = TRUE;
|
| Or if you have your vendor/ directory located somewhere else, you
| can opt to set a specific path as well:
|
|   $config['composer_autoload'] = '/path/to/vendor/autoload.php';
|
| Note: This will NOT disable or override the CodeIgniter-specific
|   autoloading (application/config/autoload.php)
*/
$config['composer_autoload'] = TRUE;
require_once APPPATH.'vendor/autoload.php';

只需确保您将供应商文件夹放在应用程序文件夹中,然后您就可以开始了。

我最近发现,您只需设置 $config['composer_autoload'] = TRUE; 并将供应商文件夹放在应用程序文件夹中即可。

对于那些希望将供应商文件夹放在应用程序文件夹外的人。您可以按照以下方式实现:例如,您想将其放在根文件夹中。

提示:已在评论中描述过了。

$config['composer_autoload'] = '/path/to/vendor/autoload.php';

/*
|--------------------------------------------------------------------------
| Composer auto-loading
|--------------------------------------------------------------------------
|
| Enabling this setting will tell CodeIgniter to look for a Composer
| package auto-loader script in application/vendor/autoload.php.
|
|   $config['composer_autoload'] = '/path/to/vendor/autoload.php';
|
| Note: This will NOT disable or override the CodeIgniter-specific
|   autoloading (application/config/autoload.php)
*/
$config['composer_autoload'] = FCPATH .'vendor/autoload.php';
< p >FCPATH是CodeIgniter定义的根文件夹常量。< /p >

我想这会有所帮助。


1
require_once 行不是必需的。它由 system/core/CodeIgniter.php 处理。 - pbarney
好的,如果用户决定重新定位供应商文件夹,我已经添加了该功能。感谢您的评论。 - Developer Kwame
我不得不使用 APPPATH . '../vendor/autoload.php' - kurdtpage
我认为这是因为你的文件夹结构。 - Developer Kwame

9
如果您已经正确地按照所有其他指示进行操作,那么您只需要在index.php文件接近结尾处添加以下代码即可:
/*
 * --------------------------------------------------------------------
 * COMPOSER AUTOLOAD
 * --------------------------------------------------------------------
 */
include_once './vendor/autoload.php';

请确保在调用CodeIgniter Bootstrap文件之前将其插入

/*
 * --------------------------------------------------------------------
 * LOAD THE BOOTSTRAP FILE
 * --------------------------------------------------------------------
 *
 * And away we go...
 *
 */
 require_once BASEPATH.'core/CodeIgniter.php';

7
您可以直接在您的控制器中添加Composer Autoloader:
// Composer Autoloader
require FCPATH.'vendor/autoload.php';

我已经在index.php中包含了它;问题是使用FQN找不到该类。你知道怎么做吗? - Tjorriemorrie
在index.php中对我也没有用。这就是为什么我直接放在控制器中的原因。你可以尝试扩展CI_Controller并在构造函数中添加Composer Autoloader? - Kinobi

5

使用composer,有两种方法可以自动加载所需的类文件。

  1. Add below line in index.php in the root directory.

    require FCPATH . 'vendor/autoload.php';
    
  2. Or autoload directly in the controller where you want to use.

    defined('BASEPATH') OR exit('No direct script access allowed');
    
    require FCPATH . 'vendor/autoload.php';
    
    class Home extends CI_Controller {...}
    

1

我正在使用Kenjis codeigniter composer package,它将vendor目录放在根目录之外。由于没有预定义的常量(至少我不知道),我使用了以下代码:

$root = getcwd();
$config['composer_autoload'] = "$root/vendor/autoload.php";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接