4

私はExtbase1.4でTYPO34.6拡張を開発していて、外部ライブラリを含めようとしています。ライブラリ(私の場合はfacebook PHP SDK )はの下にあり$_EXTKEY/Resources/PHP/facebook-php-sdk/facebook.phpます。ライブラリを自動ロードして、必要な場所に自動的に注入(依存性注入)したいのですが。

私がオンラインで見つけたいくつかのコメントは、require_once()でライブラリを含めるべきであることを示唆しています:

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

  1. 小さなヘルパーライブラリの場合は、{PackageRoot} / Resources / PHP / {libraryName}に保存し、requireを介して含めることを目的としています。しかし、これは問題によって疑われていますか?
  2. 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()およびオブジェクトマネージャーを介したプロトタイプオブジェクトの作成に関する部分

4

2 に答える 2

3

まず、拡張ルートフォルダに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');
于 2014-03-26T12:55:32.070 に答える
2

Extbaseインジェクションは非常に簡単です。これが実際の実装です。ただし、外部ライブラリを使用することはできません。

ライブラリをロードする方法を理解したら、それを注入してみましたか?そのようです:

/**
 * @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オブジェクトを取得できます。

于 2012-05-15T16:32:38.740 に答える