首页 文章

如何在TYPO3 Extbase扩展中包含或自动加载外部库?依赖注射?

提问于
浏览
4

我正在开发一个带有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

如果它只是一个小辅助库,它应该存储在 / Resources / PHP / 中,并且只包含在require中 . 这是问题所怀疑的吗?如果FLOW3包主要代表foreing库,就像在Imagine或Swift包中一样,库代码直接放在 / 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参数 .

edit2:

我做了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()Creating Prototype Objects through the Object Manager 的部分

2 回答

  • 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对象 .

  • 2

    首先在扩展根文件夹中创建ext_autoload.php

    并添加您的代码,它包含单维数组,其中键作为类名(类名必须是带有扩展键的前缀),值包含作为文件的路径 . 确保清理您的网站

    <?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');
    

相关问题