我试图在CodeIgniter(2.2.4版)中添加omnipay,我按照使用此链接安装composer的说明:https://philsturgeon.uk/blog/2012/05/composer-with-codeigniter/
但是我有这个错误:
Fatal error: Uncaught exception 'OmnipayCommonExceptionRuntimeException' with message 'Class 'OmnipayPayPal ExpressGateway' not found' in C:xampphtdocstestservervendoromnipaycommonsrcOmnipayCommonGatewayFactory.php:105
Stack trace: #0 [internal function]: OmnipayCommonGatewayFactory->create('PayPal Express')
#1 C:xampphtdocstestservervendoromnipaycommonsrcOmnipayOmnipay.php(103): call_user_func_array(Array, Array)
#2 C:xampphtdocstestserverapplicationcontrollersTest.php(18): OmnipayOmnipay::__callStatic('create', Array)
#3 C:xampphtdocstestserverapplicationcontrollersTest.php(18): OmnipayOmnipay::create('PayPal Express')
#4 [internal function]: Test->Pay()
#5 C:xampphtdocstestserversystemcoreCodeIgniter.php(360): call_user_func_array(Array, Array)
#6 C:xampphtdocstestserverindex.php(203): require_once('C:xampphtdocs...')
#7 {main} thrown in C:xampphtdocstestservervendoromnipaycommonsrcOmnipayCommonGatewayFactory.php on line 105
我已经遵循了这篇文章的建议(CodeIgniter + omnipay安装),但他们的建议都不适合我。
我使用codeigniter 2.2.4和apache 5.4.19
有谁能帮我解决这个问题吗?我想我解决了。我发现FCPATH . 'vendor'
自动加载和APPPATH可能会发生碰撞。'core'类自动加载。如果你试图从CI_
或MY_
前缀的核心类扩展你的控制器,我相信这会起作用。另一方面,如果您尝试使用不以CI_
或MY_
或您配置的任何内容开始的核心类,则无法从供应商目录中找到所需的类。
我玩了一下,发现如果你改变配置文件中用于自动加载核心类的代码,它就会起作用。你可以使用
function __autoload($class)
{
if(strpos($class, 'CI_') !== 0)
{
include_once( APPPATH . 'core/'. $class . EXT );
}
}
或
function __autoload($class) {
if (substr($class,0,3) !== 'CI_') {
if (file_exists($file = APPPATH . 'core/' . $class . EXT)) {
include $file;
}
}
}
我把那个文件换成了这个文件:
spl_autoload_register(function ($class) {
if (substr($class,0,3) !== 'CI_') {
if (file_exists($file = APPPATH . 'core/' . $class . EXT)) {
include $file;
}
}
});
刚刚测试过,运行正常。
这是所有这些需要一步一步的过程:
1。下载omnipay到root/vandor目录。如果你没有其他的供应商依赖,在index.php
文件旁边新建composer.json
文件,下一个代码:
{
"require": {
"omnipay/omnipay": "~2.0"
}
}
2。将控制台导航到项目的根文件夹,其中还包括新创建的json文件。
3。启动命令composer install
4。在应用程序启动前包含编写器自动加载文件。一种方法是在index.php
文件的末尾,在行
require_once BASEPATH.'core/CodeIgniter.php';
,输入下一个代码:
require_once __DIR__.'/vendor/autoload.php';
5。在APPPATH . 'config/config.php'
文件的末尾,放置以下代码片段以使用核心类:
spl_autoload_register(function ($class) {
if (substr($class,0,3) !== 'CI_') {
if (file_exists($file = APPPATH . 'core/' . $class . EXT)) {
include $file;
}
}
});
6。在定义类之前,在控制器文件的开头使用所需的供应商类:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
use OmnipayOmnipay;
use OmnipayCommonGatewayFactory;
class Test extends Back_Controller
{
function __construct()
{
parent::__construct();
}
public function index()
{
var_dump(new Omnipay);
var_dump(new GatewayFactory);
}
}