从上下文调用 private PHPExcel_IOFactory::__construct() - TYPO3

Call to private PHPExcel_IOFactory::__construct() from context - TYPO3

您好必须使用 phpexcel 库创建一个 excel 导出。所以我在我的 class 中复制库,然后在我的控制器中编写以下代码

require_once PATH_site . 'typo3conf/ext/extension_name/Classes/Library/PHPExcel/IOFactory.php';

public function excelTest()
    {
        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
        $objReader = $objectManager->get('PHPExcel_IOFactory');

    }

但是它 return 一个错误

Fatal error: Call to private PHPExcel_IOFactory::__construct() from context 'TYPO3\CMS\Core\Utility\GeneralUtility' in /opt/lampp_repository/lampp-5.6/htdocs/typo3_src-7.6.6/typo3/sysext/core/Classes/Utility/GeneralUtility.php on line 4533

不要自己包含库,TYPO3 有依赖注入。您的扩展目录中的所有 php 文件都将被索引,并且其中的所有 类 将自动可用,您只需确保您的 class 缓存是新鲜的,如果有疑问通过手动删除 typo3temp/Cache/Code/ClassLoader* 文件。

如果您想将外部 class 包含到您自己的命名空间中,您必须使用 ext_autoload.php 文件提示 Extbase 如何包含它,因为如果多个扩展将代码加载到它们将冲突的相同 class 名称空间。

最好不要注入 class 本身,而是注入在其上扩展的 Abstrct,这样您就可以以不修改供应商文件的独立方式对其进行自定义。

这是我的方法:

将PHPExcel的所有文件放入yourextension/Classes/Vendor/PHPExcel.

新建文件yourextension/Classes/Vendor/PHPExcel.php:

<?php
namespace Vendorname\Extensionname\Classes;

/*
 * PhpExcel
*/
class PhpExcel implements \TYPO3\CMS\Core\SingletonInterface extends \PHPExcel {

    // Differences from the  original implementation, e.g. a writer that generates 
    // a filename and puts the Excel file into typo3temp

}

然后您应该能够在 ActionController 中注入 class @inject-Annotation:

    /**
     * PhpExcel
     *
     * @var \Vendorname\Extensionname\Classes\PhpExcel
     * @inject
     */
    protected $phpExcel;

进一步阅读: