Ошибка при установке омнипей в CodeIgniter

Я пытаюсь добавить omnipay в CodeIgniter (версия 2.2.4). Я следовал инструкциям по установке композитора по этой ссылке: https://philsturgeon.uk/blog/2012/05/composer-with-codeigniter/

но у меня есть эта ошибка:

    Fatal error: Uncaught exception 'Omnipay\Common\Exception\RuntimeException' with message 'Class '\Omnipay\PayPal Express\Gateway' not found' in C:\xampp\htdocs\testserver\vendor\omnipay\common\src\Omnipay\Common\GatewayFactory.php:105
    Stack trace: #0 [internal function]: Omnipay\Common\GatewayFactory->create('PayPal Express')
    #1 C:\xampp\htdocs\testserver\vendor\omnipay\common\src\Omnipay\Omnipay.php(103): call_user_func_array(Array, Array)
    #2 C:\xampp\htdocs\testserver\application\controllers\Test.php(18): Omnipay\Omnipay::__callStatic('create', Array)
    #3 C:\xampp\htdocs\testserver\application\controllers\Test.php(18): Omnipay\Omnipay::create('PayPal Express')
    #4 [internal function]: Test->Pay()
    #5 C:\xampp\htdocs\testserver\system\core\CodeIgniter.php(360): call_user_func_array(Array, Array)
    #6 C:\xampp\htdocs\testserver\index.php(203): require_once('C:\xampp\htdocs...')
    #7 {main} thrown in C:\xampp\htdocs\testserver\vendor\omnipay\common\src\Omnipay\Common\GatewayFactory.php on line 105

Я уже следовал предложениям из этого сообщения (CodeIgniter + установка omnipay), но ни одно из их предложений не работает для меня.

Я использую codeigniter 2.2.4 и apache 5.4.19.

Может ли кто-нибудь помочь мне решить эту проблему?


person batag    schedule 06.09.2015    source источник


Ответы (1)


Я думаю, что решил это. Я обнаружил, что может быть конфликт FCPATH . 'vendor' autoloading и APPPATH . Автозагрузка основного класса. Если вы попытаетесь расширить свой контроллер из базового класса с префиксом CI_ или MY_, я уверен, что это сработает. С другой стороны, если вы попытаетесь использовать базовый класс, который не начинается с CI_ или MY_ или чего-то еще, что вы настроили, вы не сможете найти требуемый класс в каталоге поставщиков.

Я поигрался и обнаружил, что если вы измените код, используемый в файле конфигурации для автоматической загрузки основных классов, он работает. Вы могли бы использовать

function __autoload($class)
{
    if(strpos($class, 'CI_') !== 0)
    {
        include_once( APPPATH . 'core/'. $class . EXT );
    }
}

or

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 в корневой каталог/vandor. Если у вас нет зависимостей от других поставщиков, сделайте это с помощью вновь созданного файла composer.json, расположенного рядом с файлом index.php, со следующим кодом:

    {
        "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 \Omnipay\Omnipay;
    use \Omnipay\Common\GatewayFactory;

    class Test extends Back_Controller
    {
        function __construct()
        {
            parent::__construct();
        }

        public function index()
        {
            var_dump(new Omnipay);
            var_dump(new GatewayFactory);
        }
    }
person Tpojka    schedule 06.09.2015