Загрузка php-расширения в Symfony2 — подключение к SAP

В качестве первого вопроса здесь, я начну с чего-то сложного!

Я работаю над проектом Symfony, который может связываться с SAP для извлечения данных и создания отчетов. Я использовал расширение sapnwrfc от piersharding, так как оно одно из немногих, которое можно скомпилировать с помощью моего среда (Windows x86 и php 5.6.8).

Первые шаги работали не так уж плохо:

  • добавить файлы dll в php/ext
  • добавьте строку php-sapnwrfc-x86.dll в php.ini
  • он появляется на phpinfo()
  • заставьте его работать в образце файла вне symfony (автономный php-скрипт) с помощью такого кода:

/test.php

 <? php
 require_once 'sap_config.php';
 require_once 'spyc.php';
 extension_loaded("sapnwrfc");
 global $SAP_CONFIG;
 class _
 {
     public function setUp() {
         global $SAP_CONFIG;
         $this->config = Spyc::YAMLLoad($SAP_CONFIG);
     }

     public function sapConnect() {
         try {
             $this->conn = new sapnwrfc($this->config);
         }
         ....
  • Итак, я попробовал что-то подобное в проекте Symfony, но появляется эта ошибка:
    #P5#

с этим кодом:

/src/myBundle/Extensions/SapConnection.php

<?php

namespace SE\InputBundle\Extensions;

use SE\InputBundle\Extensions\SapConfig;
use SE\InputBundle\Extensions\Spyc;
use SE\InputBundle\Entity\SAPRF;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;

//the following doesn't seem to do much:
extension_loaded("sapnwrfc");

use sapnwrfc;
use sapnwrfcConnectionException;
use sapnwrfcCallException;

global $SAP_CONFIG;

class SapConnection
{
    public function setUp() {
        global $SAP_CONFIG;
        $this->config = Spyc::YAMLLoad($SAP_CONFIG);
        //the following displays "false"
        $alertpop = (class_exists("sapnwrfc")) ? "true" : "false";
        echo "<script type='text/javascript'>alert('$alertpop');</script>";
    }

    public function sapConnect() {
        try {
            // the error is triggered here
            $this->conn = new sapnwrfc($this->config);
        }
        catch (sapnwrfcConnectionException $e) {
            echo "Exception type: ".$e."<br />";
            echo "Exception key: ".$e->key."<br />";
            echo "Exception code: ".$e->code."<br />";
            echo "Exception message: ".$e->getMessage();
        }
        catch (Exception $e) {
            echo "Exception type: ".$e."\n";
            echo "Exception key: ".$e->key."\n";
            echo "Exception code: ".$e->code."\n";
            echo "Exception message: ".$e->getMessage();
            throw new Exception('Connection failed.');
        }    
    }

.....

и, конечно же, это не сработает, если я удалю оператор использования ... Google не очень поможет, поскольку это кажется довольно специфичным. У вас есть идея? Будет ли это проблемой совместимости между symfony и php-расширением, или мне нужно уведомить Symfony, чтобы использовать этот класс в качестве php-расширения? Или это где-то в моей конфигурации проекта, что я сделал что-то не так?

Дайте мне знать, если вы хотите получить более подробную информацию!


person Lucas    schedule 16.06.2015    source источник
comment
Добро пожаловать в СО. Как вы это написали, PHP пытается найти это расширение в пространстве имен Extensions.   -  person web-nomad    schedule 16.06.2015


Ответы (1)


Попробуйте следующее:

use \sapnwrfc;
use \sapnwrfcConnectionException;
use \sapnwrfcCallException;

Вам не хватает \, что приводит к тому, что php ищет эти классы в текущем пространстве имен, то есть Extensions. (Первая строка в вашем коде.)

Кроме того, вам нужно исключить свои классы/исключения.

public function sapConnect() {
    try {
        // the error is triggered here
        $this->conn = new \sapnwrfc($this->config);
    }
    catch (\sapnwrfcConnectionException $e) {
        echo "Exception type: ".$e."<br />";
        echo "Exception key: ".$e->key."<br />";
        echo "Exception code: ".$e->code."<br />";
        echo "Exception message: ".$e->getMessage();
    }
    catch (\Exception $e) {
        echo "Exception type: ".$e."\n";
        echo "Exception key: ".$e->key."\n";
        echo "Exception code: ".$e->code."\n";
        echo "Exception message: ".$e->getMessage();
        throw new \Exception('Connection failed.');
    }    
}

Надеюсь, поможет.

person web-nomad    schedule 16.06.2015
comment
Привет, спасибо @web-nomad за быстрый ответ. К сожалению, это не решает проблему. Ошибка, выдаваемая symfony, такая же: функция не распознана в глобальном пространстве имен. Я сомневаюсь, что мы сможем подняться выше глобального пространства имен. Небольшое предупреждение по-прежнему отображает false. Спасибо - person Lucas; 16.06.2015
comment
Можете ли вы напечатать $SAP_CONFIG в методе setUp и посмотреть, есть ли правильные значения. - person web-nomad; 16.06.2015
comment
Да, это имеет. Это массив со следующими ключами: 'ASHOST' => '...', 'SYSNR' => '00', 'CLIENT' => '200', 'user' => '...', ' passwd' => '...', 'LANG' => 'en', 'TRACE' => 1, 'LOGLEVEL' => 'предупреждать' - person Lucas; 16.06.2015