2014-01-13 22 views
0

因此,我在my_drupal_module/lib/Drupal /中安裝了帶有Composer的Paypal REST API(https://github.com/paypal/rest-api-sdk-php),現在我想在模塊中的函數中使用名稱空間。我知道我需要像xautoload(https://drupal.org/project/xautoload)這樣做,所以我嘗試了這樣的:Drupal 7 xautoload作曲家

$ payer = new \ Drupal \ vendor \ PayPal \ Api \ Payer;

有和沒有第一個斜槓,最後有和沒有括號但它沒有工作。我補充說:

要求DIR。 '/lib/Drupal/vendor/autoload.php';

但仍然沒有,所以我評論它。同時我發現這個:https://drupal.org/node/1976206解釋了這個問題,但是我不清楚在hook_xautoload()中寫什麼或者直接註冊我的設置。有人可以幫忙嗎?

回答

0

您認爲您需要XAutoload才能使用Composer安裝的Paypal API,這是錯誤的。

您需要使Composer安裝的任何代碼可用的唯一方法是在您需要任何提供的類時將Composer自動加載器包含在代碼執行路徑中。最簡單的形式是簡單地在第一個index.php(或任何Drupal使用的)文件中需要Composer自動加載器,它可以回答每個請求(可能實例化更多的Drupal類,模塊和東西)。

一旦代碼執行到您自己的代碼中,自動加載允許您的代碼包含Composer包含的所有類。

如何使用代碼?不要爲現有代碼創建自己的名稱空間,它將無法工作。 「\ Drupal \ vendor \ PayPal \ Api \ Payer」對我來說聽起來很不對勁,我懷疑正確的名稱空間是「\ PayPal \ Api \ Payer」。是的,that file does indeed exist。所以你必須使用它。

如果它仍然不起作用,抱怨類無法加載,那麼Composer自動加載器文件不包含在腳本代碼路徑中。

+0

我一個Drupal模塊,需要是獨立的,對矯正Drupal的文件,如index.php文件中使用貝寶是不是一種選擇,而不是由任何人recomended。我試圖要求自動加載器並使用命名空間,但問題是Drupal 7是在PHP 5.3之前編寫的,意思是在命名空間之前,而Drupal對它們有問題。這就是爲什麼我問這個問題。 –

1

沒關係。我解決了它。由於proloy03誰給我的想法:https://drupal.org/node/2096621

你不需要xautoload加載類和命名空間只實現hook_init要求它像這樣:

function my_module_init() { 
    require __DIR__ . '/vendor/autoload.php'; 
} 

,然後在你的函數寫:

$payer = new PayPal\Api\Payer(); 

這一切都有效。

+0

謝謝。謝謝。謝謝。花時間發佈這個答案。謝謝。 – RogerRoger

+0

不要使用hook_init()。這是一個全球性的鉤子,可以將單個頁面加載到您的Drupal站點。這是非常昂貴的。即使您不需要它,您的Paypal庫也會加載到網站的每個部分。 –

+0

那你有什麼建議?如果你找到了替代方法,那麼請分享一下嗎? –

0

隨着xautload你可以做這樣的事情...

在mymodule.module

function mymodule_libraries_info() { 

'paypal' => array(
     'name' => 'PayPal SDK', 
     'xautoload' => function($adapter) { 
     $adapter->composerJson('composer.json'); 
    } 
} 

此聲明允許您使用的命名空間。像

use PayPal\Api\Amount; 

檢查xautoload.api.php