【问题标题】:How do I include or autoload external libraries in a TYPO3 Extbase Extension? + Dependecy Injection?如何在 TYPO3 Extbase 扩展中包含或自动加载外部库? + 依赖注入?
【发布时间】:2012-05-23 04:18:51
【问题描述】:

我正在使用 Extbase 1.4 开发一个 TYPO3 4.6 扩展,并且我试图包含一个外部库。图书馆,在我的例子中是facebook PHP SDK,在$_EXTKEY/Resources/PHP/facebook-php-sdk/facebook.php下。我希望库在我需要的地方自动加载并自动注入(Dependecy Injection)。

我在网上找到的一些 cmets 建议应该包含带有 require_once() 的库:

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

  1. 如果它只是一个很小的帮助库,它的目的是存储在 {PackageRoot}/Resources/PHP/{libraryName} 中并通过 require 包含。但是这是否是问题的怀疑?
  2. 如果 FLOW3 包根本就主要代表外部库,就像 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 参数。

编辑2:

我按照彼得在他的回答中所说的做了,在 @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()通过对象管理器创建原型对象

的部分

【问题讨论】:

    标签: dependency-injection typo3 autoload extbase


    【解决方案1】:

    首先在扩展根文件夹中创建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');
    

    【讨论】:

      【解决方案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 对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多