在extbase扩展中,如何从调度程序任务访问持久层?

Urs*_*Urs 2 typo3 extbase typo3-6.1.x

标题听起来有点学术化实际上非常简单:我已经设置了一个TYPO3 6.1 extbase扩展,我已配备了调度程序任务.该任务应该导入CSV文件并将其保存到扩展的数据库字段中.

但是,如何告诉调度程序任务使用扩展模型等并将接收到的数据保存到持久层?

我已经看到了类似问题的答案:在调度程序任务中执行存储库函数,我认为它指向正确的方式,但我认为需要一个完整的示例来开始理解依赖注入的工作原理.

lor*_*enz 13

首先,你必须要考虑的性能方面:

如果你想插入数据的数量较大,则不应使用Extbase持久性这样的任务.因为如果这样做,它将为您要插入的每一行生成一个对象,并立即将其保留.这很慢并且占用大量内存.

如果您没有太多数据或拆分作业(例如,每个调度程序运行执行100个导入作业),则使用Extbase持久性.

您可以同时在命令控制器方面,由于CommandControllers是直截了当的设置,你应该去为他们而不是自己的调度任务.

使用Extbase持久性

在CommandController中,注入您的存储库:

/**
 * myRepository
 *
 * @var \Venor\Myext\Domain\Repository\MyRepository
 * @inject
 */
protected $myRepository
Run Code Online (Sandbox Code Playgroud)

然后通过您要导入(的foreach)和每一行创建一个新的对象,并把它添加到您的存储库中的行迭代:

 $myObject = $this->objectManager->get('Vendor\Myext\Domain\Model\MyModel');
 $myObject->setProperty('foo');
 $myObject->setOtherProperty('bar');
 $this->myRepository->add($myObject);
Run Code Online (Sandbox Code Playgroud)

要真正的对象保存到数据库中,你需要坚持他们.所以你也注入了persistenceManager:

/**
 * @var \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
 * @inject
 */
protected $persistenceManager;
Run Code Online (Sandbox Code Playgroud)

并使用它:

 $this->persistenceManager->persistAll();
Run Code Online (Sandbox Code Playgroud)

您不应该为每个对象执行此操作(出于性能原因); 但内存使用的原因,你不应该等到成千上万个对象的坚持,无论是.所以,你只需插入一个迭代的foreach循环,并坚持每20,40,或任何循环.

请不要忘记,在调度方面后台工作,所以Typo脚本必须是可用的module.tx_yourext.如果你想共享相同的设置/ storagePid与您的应用程序的前端部分,使用

module.tx_yourext.persistence < plugin.tx_yourext.persistence
[...]
Run Code Online (Sandbox Code Playgroud)

Typo脚本需要存在于您的网站的后端模块/ CommandControllers使用它们的根页.我建议你将这些东西添加到myext/Configuration/TypoScript/setup.txt中,并将扩展的静态模板添加到根页面.

使用DataHandler

TYPO3 DataHandler(以前称为TCEmain)是TYPO3后端用于插入和修改数据库记录的引擎.它非常强大.

在循环内部而不是对象,您将创建一个包含所有数据的数组.第一阵列索引是表,一个新的水平是受影响的记录,在那里新的手段,一个新的记录被创建.然后,你可以设置表的各个领域与所需的值

    $data = array();
    $data['be_users']['NEW'] = array(
        'pid' => 0,
        'username' => $staffMember['IDPerson'],
        'password' => md5(GeneralUtility::generateRandomBytes(40)), // random password
        'usergroup' => '1,2',
        'email' => $staffMember['Email'],
        'realName' => $staffMember['Nachname'] . ' ' . $staffMember['Vorname'],
        'lang' => 'de',
    );
Run Code Online (Sandbox Code Playgroud)

现在,您可以创建DataHandler实例并保留更改:

    /** @var $tce t3lib_TCEmain */
    $tce = GeneralUtility::makeInstance('TYPO3\CMS\Core\DataHandling\DataHandler');
    $tce->bypassAccessCheckForRecords = TRUE;
    $tce->start($data, array());
    $tce->admin = TRUE;
    $tce->process_datamap();
    $newRecordsUidArray = $tce->substNEWwithIDs['NEW'];
Run Code Online (Sandbox Code Playgroud)

请注意该行$tce->admin = TRUE.这表明该管理员所执行的操作的DataHandler.这很方便,因为您不必为Scheduler用户设置允许的排除字段,也可以将记录插入PID 0.但这是一个可能的安全漏洞,因此请仔细考虑其用法.

正确记录DataHandler插入/更新的记录,可以还原等.您可以在此处找到一些示例(例如添加图片,解析MM关系).在这种情况下,所有的DataHandler相关的功能被转移到被注入到命令控制器如上所述(它只是在Extbase约定命名)的外部存储库类.

的DataHandler的功能的很好的概述,可以发现在这里.

  • TypoScript需要出现在您网站的根页面中,以便后端模块/ CommandControllers使用它们.我建议你将这些东西添加到myext/Configuration/TypoScript/setup.txt中,并将你的ext的静态模板添加到根页面. (2认同)