我正在开发一个带有Extbase 1.4的TYPO3 4.6扩展,我试图包含一个外部库。在我的案例中,facebook PHP SDK的图书馆位于$_EXTKEY/Resources/PHP/facebook-php-sdk/facebook.php
下。我希望该库自动加载并自动注入(Dependecy Injection)我需要的地方。
我在网上发现的一些评论建议应该包含带有require_once()的库:
http://forge.typo3.org/issues/33142
- 如果它只是一个小帮助程序库,它应该存储在{PackageRoot} / Resources / PHP / {libraryName}中,并且只是通过require包含。但问题是怀疑这个吗?< / LI>
- 如果FLOW3包主要代表foreing库,就像Imagine或Swift包那样,库代码直接放在{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',
);
?>
它似乎找到并包含正确的文件。但是当我尝试使用依赖注入(如peter answered)时,我收到一个错误:
未传递构造函数依赖项的正确信息数组!
在第247行的文件/var/syscp/webs/web1/dev/typo3_src-4.5.15/typo3/sysext/extbase/Classes/Object/Container/Container.php中抛出InvalidArgumentException。
我认为这是因为Facebook类的构造函数有一个必需的$ config参数。
我做了peter在他的回答中所说的,并且在@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()和通过对象管理器创建原型对象的部分
答案 0 :(得分:2)
Extbase注入非常简单。 Here's the actual implementation.但是,使用外部库不是。
一旦你弄清楚如何加载库,你试过注入它吗?像这样:
/**
* @var Facebook
*/
protected $facebook;
/**
* inject the facebook
*
* @param Facebook facebook
* @return void
*/
public function injectFacebook(Facebook $facebook) {
$this->facebook = $facebook;
}
注意:您需要在评论中添加@param,并且还需要在添加此代码后清除配置缓存。
我不知道Facebook SDK API,但希望您可以使用默认构造函数实例化Facebook对象,然后使用setter方法添加参数。您可能想要创建一个加载Facebook PHP并设置基本参数的FacebookService类(单例)。然后,您可以在需要时注入FacebookService以获取实际的Facebook对象。
答案 1 :(得分:2)
首先在扩展根文件夹
中创建ext_autoload.php并添加您的代码,它包含带有键作为类名的单维数组(类名必须是带扩展名的前缀),value作为文件路径。 确保清除您的网站
<?php
$extensionPath = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('rent_system');
return array(
'rent_system_TCPDF' => $extensionPath.'Resources/Private/PHP/tcpdf/tcpdf.php',
);
?>
在控制器文件中
$pdf = $this->objectManager->create('rent_system_TCPDF');