Wie binde ich externe Bibliotheken in eine TYPO3 Extbase-Erweiterung ein oder lade sie automatisch? + Dependecy Injection?

Ich entwickle eine TYPO3 4.6 Extension mit Extbase 1.4 und versuche eine externe Bibliothek einzubinden. Die Bibliothek, in meinem Fall dieFacebook PHP SDK, ist unter$_EXTKEY/Resources/PHP/facebook-php-sdk/facebook.php. Ich möchte, dass die Bibliothek automatisch geladen und dort, wo ich sie benötige, automatisch injiziert wird (Dependecy Injection).

Einige Kommentare, die ich online gefunden habe, schlagen vor, dass man Bibliotheken mit require_once () einbinden sollte:

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

Wenn es sich nur um eine winzige Hilfsbibliothek handelt, soll sie in {PackageRoot} / Resources / PHP / {libraryName} gespeichert und nur über require eingebunden werden. Wird dies jedoch durch das Problem vermutet?Wenn das FLOW3-Paket hauptsächlich die vorherige Bibliothek darstellt, wie es bei Imagine oder Swift der Fall ist, wird der Bibliothekscode direkt unter {PackageRoot} / Classes eingefügt. "

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

"Ich würde die Klasse (mithilfe von require_once) in eine bestimmte Aktion einbinden, um dies zu handhaben. Auf diese Weise haben Sie Zugriff auf diese Funktionen und die Klasse wird zu Ihrer Bibliothek."

Ich habe es versucht und es funktioniert so:

<?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();
}

}
?>

Aber wie kann ich es dazu bringen, die Bibliothek automatisch zu laden und mit der Funktion injectFacebook zu injizieren?

bearbeiten:

Mögen@alex_schnitzler und@sorenmalling Erwähnt über Autoloading:

@PeterTheOne Alle Dateien in ext_autoload.php ablegen und dann DI oder den Objektmanager verwenden.

@PeterTheOne die Klassendefinition in ext_autoload.php in Ihrer Erweiterung einfügen?

Ich habe es so ausprobiert (Datei: ext_autoload.php):

<?php

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

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

?>

Es scheint die richtige Datei zu finden und aufzunehmen. Aber wenn ich versuche, Abhängigkeit Injection Benutzer (wiePeter antwortete) Ich erhalte eine Fehlermeldung:

Es wurde kein korrektes Info-Array von Konstruktorabhängigkeiten übergeben!

InvalidArgumentException in der Datei /var/syscp/webs/web1/dev/typo3_src-4.5.15/typo3/sysext/extbase/Classes/Object/Container/Container.php in Zeile 247.

Ich denke, das liegt daran, dass der Konstruktor der Facebook-Klasse ein erforderliches $ config-Argument hat.

edit2:

Ich tat, was Peter in seiner Antwort und mit der Hilfe von sagte@alex_schnitzler und@sorenmalling, der mich auf den ObjectManager verwies, mein FacebookService sieht jetzt so aus:

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;
}

}

Weitere Hilfe finden Sie unter:http://forge.typo3.org/projects/typo3v4-mvc/wiki/Dependency_Injection_(DI) die teile überinitializeObject () undErstellen von Prototypobjekten über den Objektmanager

Antworten auf die Frage(2)

Ihre Antwort auf die Frage