Jak włączyć lub automatycznie załadować zewnętrzne biblioteki w rozszerzeniu TYPO3 Extbase? + Dependecy Injection?

Opracowuję rozszerzenie TYPO3 4.6 z Extbase 1.4 i próbuję dołączyć zewnętrzną bibliotekę. Biblioteka, w moim przypadkufacebook PHP SDK, jest pod$_EXTKEY/Resources/PHP/facebook-php-sdk/facebook.php. Chciałbym, aby biblioteka ładowała się automatycznie i automatycznie wstrzykiwała (Dependecy Injection) tam, gdzie jej potrzebuję.

Niektóre komentarze, które znalazłem w Internecie, sugerują, że należy dołączyć biblioteki z require_once ():

http://forge.typo3.org/issues/33142

jeśli jest to tylko mała biblioteka pomocnicza, ma być przechowywana w {PackageRoot} / Resources / PHP / {libraryName} i właśnie dołączona przez require. czy jednak podejrzewa ten problem?jeśli pakiet FLOW3 reprezentuje głównie bibliotekę foreing, tak jak w przypadku pakietu Imagine lub Swift, kod biblioteki jest umieszczany poniżej {PackageRoot} / Classes bezpośrednio. "

http://lists.typo3.org/pipermail/typo3-project-typo3v4mvc/2011-July/009946.html

„Chciałbym dołączyć klasę (używając require_once) z określonej akcji do obsługi tego. W ten sposób masz dostęp do tych funkcji, a klasa staje się twoją biblioteką.”

Próbowałem tego i działa tak:

<?php
require_once( t3lib_extMgm::extPath('extkey') . 'Resources/PHP/facebook-php-sdk/facebook.php');

class Tx_WsLogin_Domain_Repository_FacebookUserRepository extends Tx_WsLogin_Domain_Repository_UserRepository {

protected $facebook;

public function __construct() {
    $this->setFacebook(new Facebook(array(
        'appId' =>'',
        'secret' => '')
    ));
    parent::__construct();
}

public function setFacebook(Facebook $facebook) {
    $this->facebook = $facebook;
}


public function sampleFunction() {
    $userId = $this->facebook->getUser();
}

}
?>

Ale jak mogę go załadować i automatycznie wstrzyknąć bibliotekę za pomocą funkcji injectFacebook?

edytować:

Lubić@alex_schnitzler i@sorenmalling wspomniał o automatycznym ładowaniu:

@PeterTheOne Umieść wszystkie pliki wewnątrz ext_autoload.php, a następnie użyj DI lub menedżera obiektów.

@PeterTheOne umieścił definicję klasy w ext_autoload.php w swoim rozszerzeniu?

Próbowałem tego w ten sposób (plik: ext_autoload.php):

<?php

$extPath = t3lib_extMgm::extPath('extKey');

return array(
    'facebook' => $extPath . 'Resources/PHP/facebook-php-sdk/facebook.php',
);

?>

Wygląda na to, że znajduje i zawiera właściwy plik. Ale kiedy próbuję użyć Dependency Injection (jakpeter odpowiedział) Dostaję błąd:

nie przekazano poprawnej tablicy informacji o zależnościach konstruktora!

Wyjątek InvalidArgumentException w pliku /var/syscp/webs/web1/dev/typo3_src-4.5.15/typo3/sysext/extbase/Classes/Object/Container/Container.php w linii 247.

Myślę, że jest tak, ponieważ konstruktor klasy Facebook ma wymagany argument $ config.

edytuj2:

Zrobiłem to, co powiedział Peter w swojej odpowiedzi i za pomocą@alex_schnitzler i@sorenmalling, który wskazał mi obiekt ObjectManager, mój FacebookService wygląda teraz tak:

class Tx_Extkey_Service_FacebookService implements t3lib_Singleton {

/**
* @var Tx_Extbase_Object_ObjectManagerInterface
*/
protected $objectManager;

/**
 * Facebook from @link https://github.com/facebook/facebook-php-sdk facebook-php-sdk
 *
 * @var Facebook
 */
protected $facebook;

/**
* @param Tx_Extbase_Object_ObjectManagerInterface $objectManager
*/
public function injectObjectManager(Tx_Extbase_Object_ObjectManagerInterface $objectManager) {
    $this->objectManager = $objectManager;
}

/**
 * 
 */
public function initializeObject() {
    $this->facebook = $this->objectManager->create(
        'Facebook',
        array(
            'appId' =>'input appId here',
            'secret' => 'input app secret here'
        )
    );
}

/**
 * @return Facebook
 */
public function getFacebook() {
    return $this->facebook;
}

}

Aby uzyskać więcej pomocy, przeczytaj:http://forge.typo3.org/projects/typo3v4-mvc/wiki/Dependency_Injection_(DI) części oinitializeObject () iTworzenie obiektów prototypowych za pomocą Menedżera obiektów

questionAnswers(2)

yourAnswerToTheQuestion