Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 如何在TYPO3 Extbase扩展中包括或自动加载外部库+;依赖性注射?_Dependency Injection_Typo3_Autoload_Extbase - Fatal编程技术网

Dependency injection 如何在TYPO3 Extbase扩展中包括或自动加载外部库+;依赖性注射?

Dependency injection 如何在TYPO3 Extbase扩展中包括或自动加载外部库+;依赖性注射?,dependency-injection,typo3,autoload,extbase,Dependency Injection,Typo3,Autoload,Extbase,我正在用Extbase 1.4开发一个TYPO3 4.6扩展,我试图包括一个外部库。在我的例子中,该库位于$\u EXTKEY/Resources/PHP/facebook-PHP-sdk/facebook.PHP下。我想库自动加载和自动注入(依赖注入)在我需要它 我在网上找到的一些评论建议应该包括带有require_once()的库: 如果它只是一个很小的助手库,那么它应该存储在{PackageRoot}/Resources/PHP/{libraryName}中,并通过require包含进去

我正在用Extbase 1.4开发一个TYPO3 4.6扩展,我试图包括一个外部库。在我的例子中,该库位于
$\u EXTKEY/Resources/PHP/facebook-PHP-sdk/facebook.PHP
下。我想库自动加载和自动注入(依赖注入)在我需要它

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

  • 如果它只是一个很小的助手库,那么它应该存储在{PackageRoot}/Resources/PHP/{libraryName}中,并通过require包含进去。但是问题是否怀疑这一点
  • 如果FLOW3包主要表示foreing库,就像Imagine或Swift包中的情况一样,库代码直接放在{PackageRoot}/Classes下面。”
  • “我会将类(使用require_一次)包含在一个特定的操作中来处理这个问题。这样,您就可以访问这些函数,该类将成为您的库。”

    我试过这个,它是这样工作的:

    
    
    但是我怎样才能让它自动加载并用injectFacebook函数自动注入库呢

    编辑: 喜欢并提到自动加载:

    @PeterTheOne将所有文件放在ext_autoload.php中,然后使用DI或对象管理器

    @Petertheon是否将类定义放入扩展中的ext_autoload.php中

    我这样试过(文件:ext_autoload.php):

    
    
    它似乎找到并包含了正确的文件。但当我尝试进行用户依赖项注入(如)时,我得到了一个错误:

    传递的构造函数依赖项的信息数组不正确!

    第247行/var/syscp/webs/web1/dev/typo3_src-4.5.15/typo3/sysext/extbase/Classes/Object/Container/Container.php文件中抛出的InvalidArgumentException

    我认为这是因为Facebook类的构造函数有一个必需的$config参数

    编辑2: 我按照peter在回答中所说的做了,在and的帮助下,他将我指向ObjectManager,我的FacebookService现在看起来是这样的:

    class Tx\u Extkey\u Service\u facebook服务实现t3lib\u单例{
    /**
    *@var Tx\u Extbase\u Object\u objectmanager接口
    */
    受保护的$objectManager;
    /**
    *来自@link的Facebookhttps://github.com/facebook/facebook-php-sdk facebook php sdk
    *
    *@var Facebook
    */
    保护$facebook;
    /**
    *@param Tx_Extbase_Object_objectManager接口$objectManager
    */
    公共函数injectObjectManager(Tx_Extbase_Object_objectManager接口$objectManager){
    $this->objectManager=$objectManager;
    }
    /**
    * 
    */
    公共函数初始化对象(){
    $this->facebook=$this->objectManager->create(
    “Facebook”,
    排列(
    'appId'=>'input appId here',
    “机密”=>“此处输入应用程序机密”
    )
    );
    }
    /**
    *@return-Facebook
    */
    公共函数getFacebook(){
    返回$this->facebook;
    }
    }
    

    有关更多帮助,请阅读:initializeObject()通过对象管理器创建原型对象的部分非常简单。但是,使用外部库并不简单

    一旦您知道如何加载库,您是否尝试过注入它?就像这样:

    /**
    *@var Facebook
    */
    保护$facebook;
    /**
    *注入facebook
    *
    *@param-Facebook
    *@返回无效
    */
    Facebook的公共功能(Facebook$Facebook){
    $this->facebook=$facebook;
    }
    
    注意:您需要注释中的@param,并且在添加此代码后还需要清除配置缓存


    我不知道Facebook SDK API,但希望您可以使用默认构造函数实例化Facebook对象,然后使用setter方法添加参数加载Facebook PHP并设置基本参数。然后,您可以随时插入FacebookService以获取实际的Facebook对象。

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