私はExtbase1.4でTYPO34.6拡張を開発していて、外部ライブラリを含めようとしています。ライブラリ(私の場合はfacebook PHP SDK )はの下にあり$_EXTKEY/Resources/PHP/facebook-php-sdk/facebook.php
ます。ライブラリを自動ロードして、必要な場所に自動的に注入(依存性注入)したいのですが。
私がオンラインで見つけたいくつかのコメントは、require_once()でライブラリを含めるべきであることを示唆しています:
http://forge.typo3.org/issues/33142
- 小さなヘルパーライブラリの場合は、{PackageRoot} / Resources / PHP / {libraryName}に保存し、requireを介して含めることを目的としています。しかし、これは問題によって疑われていますか?
- ImagineまたはSwiftパッケージの場合のように、FLOW3パッケージが主に先行ライブラリを表す場合、ライブラリコードは{PackageRoot}/Classesの下に直接配置されます。」
http://lists.typo3.org/pipermail/typo3-project-typo3v4mvc/2011-July/009946.html
「これを処理するために、特定のアクション内から(require_onceを使用して)クラスを含めます。そうすれば、これらの関数にアクセスでき、クラスがライブラリになります。」
私はこれを試しました、そしてそれはこのように働きます:
<?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();
}
}
?>
しかし、どうすればそれを自動ロードして、injectFacebook関数を使用してライブラリを自動的に挿入できますか?
編集:
自動読み込みについて言及した@alex_schnitzlerと@sorenmallingのように:
@PeterTheOneすべてのファイルをext_autoload.php内に配置してから、DIまたはオブジェクトマネージャーを使用します。
@PeterTheOneは、クラス定義を拡張機能のext_autoload.phpに入れますか?
私はこのように試しました(ファイル:ext_autoload.php):
<?php
$extPath = t3lib_extMgm::extPath('extKey');
return array(
'facebook' => $extPath . 'Resources/PHP/facebook-php-sdk/facebook.php',
);
?>
適切なファイルを見つけて含めるようです。しかし、依存性注入を使用しようとすると(ピーターが答えたように)、エラーが発生します:
コンストラクターの依存関係の正しい情報配列が渡されませんでした!
247行目のファイル/var/syscp/webs/web1/dev/typo3_src-4.5.15/typo3/sysext/extbase/Classes/Object/Container/Container.phpにInvalidArgumentExceptionがスローされました。
これは、Facebookクラスのコンストラクターに必須の$config引数があるためだと思います。
edit2:
私はピーターが彼の答えで言ったことをしました、そして@alex_schnitzlerと@sorenmallingの助けを借りて、私をObjectManagerに向けました、私のFacebookServiceは今このように見えます:
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;
}
}
詳細については、以下をお読みください:http: //forge.typo3.org/projects/typo3v4-mvc/wiki/Dependency_Injection_(DI)initializeObject()およびオブジェクトマネージャーを介したプロトタイプオブジェクトの作成に関する部分