【问题标题】:Need help understanding install of DOMPDF with Composer and Symfony需要帮助了解使用 Composer 和 Symfony 安装 DOMPDF
【发布时间】:2018-04-14 07:07:56
【问题描述】:

我在尝试弄清楚如何通过 Composer 和 Symfony 安装和使用 DOMPDF 时遇到了很多麻烦。这是几年前写的一个项目,我对 Composer、Symfony 和 DOMPDF 完全陌生......其他人告诉我我们正在使用 Composer 和 Symfony。

我使用 puTTy 命令行界面通过以下方式安装了 DOMPDF: 1.转到我的composer.json所在的文件夹(供应商) 2.运行命令“安装dompdf/dompdf”它成功完成,没有错误。 3. 然后运行命令 composer "require dompdf/dompdf" 也成功完成,没有错误。

然后我会迷路/困惑...

我看到使用 :

编辑 composer.json 的说明
{
"require": {
    "squizlabs/php_codesniffer": "2.0.*",
}

这里是composer.json的新内容

{
"require": {
    "spipu/html2pdf": "^5.0",
    "dompdf/dompdf": "^0.8.1"
}

我尝试在我的 PHP 代码中添加以下行来使用 DOMPDF,但我得到的只是一个空白页

use Dompdf\Dompdf;

还有一个 autoload.php,如下所示:

//autoload.php @generated by Composer 
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit********************************::getLoader();

在兔子洞之后,autoload_real.php 看起来像这样:

// autoload_real.php @generated by Composer
class ComposerAutoloaderInit987ec9019a1b2f978bf00ce76684ede0
private static $loader;

public static function loadClassLoader($class)
{
    if ('Composer\Autoload\ClassLoader' === $class) {
        require __DIR__ . '/ClassLoader.php';
    }
}

public static function getLoader()
{
    if (null !== self::$loader) {
        return self::$loader;
    }

    spl_autoload_register(array('ComposerAutoloaderInit987ec9019a1b2f978bf00ce76684ede0', 'loadClassLoader'), true, true);
    self::$loader = $loader = new \Composer\Autoload\ClassLoader();
    spl_autoload_unregister(array('ComposerAutoloaderInit987ec9019a1b2f978bf00ce76684ede0', 'loadClassLoader'));

    $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
    if ($useStaticLoader) {
        require_once __DIR__ . '/autoload_static.php';

        call_user_func(\Composer\Autoload\ComposerStaticInit987ec9019a1b2f978bf00ce76684ede0::getInitializer($loader));
    } else {
        $map = require __DIR__ . '/autoload_namespaces.php';
        foreach ($map as $namespace => $path) {
            $loader->set($namespace, $path);
        }

        $map = require __DIR__ . '/autoload_psr4.php';
        foreach ($map as $namespace => $path) {
            $loader->setPsr4($namespace, $path);
        }

        $classMap = require __DIR__ . '/autoload_classmap.php';
        if ($classMap) {
            $loader->addClassMap($classMap);
        }
    }

    $loader->register(true);

    if ($useStaticLoader) {
        $includeFiles = Composer\Autoload\ComposerStaticInit987ec9019a1b2f978bf00ce76684ede0::$files;
    } else {
        $includeFiles = require __DIR__ . '/autoload_files.php';
    }
    foreach ($includeFiles as $fileIdentifier => $file) {
        composerRequire987ec9019a1b2f978bf00ce76684ede0($fileIdentifier, $file);
    }

    return $loader;
}}function composerRequire987ec9019a1b2f978bf00ce76684ede0($fileIdentifier, $file){if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
    require $file;$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;}}

此外,我在供应商文件中有 14 个文件夹,我假设它们都是与 Composer 一起使用的包,但我没有看到 composer.json 文件中需要它们,并且在安装 DOMPDF 后,我不需要查看供应商文件夹。我想删除它们,但我不知道什么正在使用,什么没有被使用。

我已经阅读了“入门指南”,但我仍然不知道我做错了什么。

我确定我还有一千多个问题...感谢您的耐心等待。

【问题讨论】:

    标签: symfony composer-php dompdf


    【解决方案1】:

    a) 您的 composer.json 文件应该在项目目录的根目录中,而不是在供应商目录中。

    b) 只需输入命令

    作曲家需要 dompdf/dompdf

    在您的项目目录中应该足以在供应商目录中安装库并添加行

    "dompdf/dompdf": "^0.8.1"

    在您的 composer.json 中。

    c) 遵循https://github.com/dompdf/dompdf 的说明如何使用 dompdf。

    d) 通常,在使用 composer 时,您必须包含 vendor/autoload.php 文件,但在 Symfony 框架中,这将在 app/autoload.php 中发生。

    需要'vendor/autoload.php';

    e) dompdf 确实使用命名空间。小例子:

    require "../vendor/autoload.php"; // change path if you need to
    
    use Dompdf\Dompdf;
    
    // instantiate and use the dompdf class
    $dompdf = new Dompdf();
    $dompdf->loadHtml('hello world');
    
    // (Optional) Setup the paper size and orientation
    $dompdf->setPaper('A4', 'landscape');
    
    // Render the HTML as PDF
    $dompdf->render();
    
    // Output the generated PDF to Browser
    $dompdf->stream();
    

    f) 许多可以用 composer 安装的包也使用其他包。如果你看一下composer.json from dompdf,你会发现它需要一些其他的包,composer 会自动为你安装。

    [编辑]

    您的 composer.json 位于项目的根目录中。您的供应商目录也是如此。在您的供应商目录中会有一个作曲家目录,这是正常的。但是从你的根目录执行任何命令。结构:

    - [project root] (execute commands here)
           |
           |- composer.json
           |- [vendor]
                 |
                 |- [composer]
    

    如果您遇到问题,只需删除整个供应商目录和 composer.json 文件,然后再次使用该命令

    作曲家需要 dompdf/dompdf

    【讨论】:

    • 谢谢,还有几个问题:~ 我没有安装 Composer,但它似乎安装在供应商目录中,因为如果我在项目文件夹中运行命令(通过 puTTy),我会收到错误,但是如果我在供应商目录中运行命令,它们会成功完成。此外,composer.json 文件位于供应商目录中。假设: -project 目录:project/includes/part1/page2print.php -composer 安装在:project/vendor 在 page2print.php 中调用命令“use Dompdf\Dompdf”失败。是 Composer 安装的问题吗?
    • 另外,关于安装 Composer:我在供应商文件夹中运行了命令“composer require dompdf/dompdf”并收到以下消息: Using version ^0.8.1 for dompdf/dompdf ./composer .json 已更新 使用包信息加载 composer 存储库 更新依赖项(包括 require-dev) 无需安装或更新 生成自动加载文件
    • 我刚刚注意到我的供应商文件夹中有一个供应商文件夹...... dompdf 文件夹位于第二个供应商文件夹中。在 sedond 供应商文件夹中还有一个额外的 autoupload.php。这是一团糟!我怎样才能把它理顺?
    • @FrankB 您好,您的指南真的很有帮助,我一步一步地跟着,但我仍然收到语法错误、意外的“使用”和未捕获的错误:找不到类“Dompdf”我该如何解决?我也在askubuntu上开了一个帖子askubuntu.com/questions/981407/…
    • 你必须将 USE 语句放在你的代码之上,并且放在任何函数和类之外。
    猜你喜欢
    • 2015-02-21
    • 2021-12-15
    • 2011-08-25
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多