الطريقة الصحيحة لاستخدام المكتبات الخارجية غير PSR-0 في مشروع Symfony2

StackOverflow https://stackoverflow.com//questions/24041485

سؤال

أنا أعمل على تطبيق من شأنه الاتصال بـ Intuit Quickbooks API من خلال REST PHP SDK الخاص بهم.في PHP الأساسي لدي أشياء تعمل دون مشكلة حيث أقوم بتحميل الملفات على النحو التالي:

require_once('../api/config.php');  // Default V3 PHP SDK (v2.0.1) from IPP
require_once(PATH_SDK_ROOT . 'Core/ServiceContext.php');
require_once(PATH_SDK_ROOT . 'DataService/DataService.php');
require_once(PATH_SDK_ROOT . 'PlatformService/PlatformService.php');
require_once(PATH_SDK_ROOT . 'Utility/Configuration/ConfigurationManager.php');

أحتاج الآن إلى استخدام المكتبات الموجودة في وحدة تحكم Symfony2 من الحزمة، ومن هنا تأتي شكوكي، كيف يمكنني تحقيق ذلك بسهولة؟قرأت الكثير من المستندات الرابط1, مكون محمل فئة Symfony وبعض الآخرين ولكن حتى ليس واضحا بالنسبة لي على الإطلاق.لقد قمت الآن بإنشاء هذا الهيكل في بلدي /vendor المجلد كما تظهر الصورة:

vendor structure

ال config.php الملف الذي يمكن أن يراه هناك يحتوي على هذا الرمز:

/**
 * This file allows custom configuration of paths for XSD2PHP dependencies and
 * POPO classes.  Rarely necessary, but possible.
 *
 * @author Intuit Partner Platform Team
 * @version 1.0
 */

// Determine parent path for SDK
$sdkDir = __DIR__ . DIRECTORY_SEPARATOR;

if (!defined('PATH_SDK_ROOT'))
    define('PATH_SDK_ROOT', $sdkDir);

// Specify POPO class path; typically a direct child of the SDK path
if (!defined('POPO_CLASS_PATH'))
    define('POPO_CLASS_PATH', $sdkDir . 'Data');

// Include XSD2PHP dependencies for marshalling and unmarshalling
use com\mikebevz\xsd2php;
require_once(PATH_SDK_ROOT . 'Dependencies/XSD2PHP/src/com/mikebevz/xsd2php/Php2Xml.php');
require_once(PATH_SDK_ROOT . 'Dependencies/XSD2PHP/src/com/mikebevz/xsd2php/Bind.php');

// Includes all POPO classes; these are the source, dest, or both of the marshalling
set_include_path(get_include_path() . PATH_SEPARATOR . POPO_CLASS_PATH);
foreach (glob(POPO_CLASS_PATH.'/*.php') as $filename)
    require_once($filename);

// Specify the prefix pre-pended to POPO class names.  If you modify this value, you
// also need to rebuild the POPO classes, with the same prefix
if (!defined('PHP_CLASS_PREFIX'))
    define('PHP_CLASS_PREFIX',    'IPP');

وهناك مكان سحري لتحميل الفصل، على الأقل بالنسبة لطريقة QBO PHP SDK، لذلك:

  • كيف يجب أن أتعامل مع هذا من أجل استخدام الفصل مثل Symfony2 هل أعني إنشاء كائنات وما إلى ذلك؟
  • نظرًا لأن هذه ليست مكتبة PSR-0، فهل سيكون Symfony Class Loader Component هو الحل؟
  • هل يمكن أن تعطيني بعض الأفكار أو حتى بعض التعليمات البرمجية لمساعدتي في تنفيذ هذا العمل؟
هل كانت مفيدة؟

المحلول

Symfony يستخدم الملحن.لذا فإن أبسط طريقة لتضمين SDK الخاص بك هي جعله متوافقًا تقريبًا مع Composer، بطريقة أو بأخرى.

وهذا سوف يتطلب أ composer.json على جذر الحزمة.اصنعها.

أبسط حل

ضع تعليمات خريطة الفصل في ملفك composer.jsonautoload قسم :

"autoload": {
    "classmap": ['src/'],
},

سيقوم الملحن بعد ذلك بمسح الملف بشكل متكرر src/ الدليل عند إنشاء ملفات التحميل التلقائي.وهكذا سيتم استيراد كل فئة عند الحاجة، دون تغيير مساحات الأسماء أو أي شيء.

الجانب السلبي هو أن المكتبة لا تزال لا تتبع PSR0، مع تضمين جميع المخاطر.

حل شاق

PSR0-ify المكتبة عن طريق تحرير كل ملف مصدر لإضافة الحق namespace و use التعليمات الموجودة أعلى كل ملف.إنها بسيطة ولكنها شاقة نظرًا لعدد الفئات الموجودة في SDK.

يمكنك بعد ذلك إضافة autoload قسم من الحزمة composer.json, ، مثله :

"autoload": {
    "psr-0": {
        "QBO\\": "src/"
    }
},

حل بديل

عند البحث عن API هذا، وجدت consolibyte/quickbooks-php هذا على موقع packagist... ربما يستحق المحاولة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top