要求(供应商/autoload.php):无法打开流:没有这样的文件或目录

Posted

技术标签:

【中文标题】要求(供应商/autoload.php):无法打开流:没有这样的文件或目录【英文标题】:require(vendor/autoload.php): failed to open stream: No such file or directory 【发布时间】:2021-07-12 03:35:00 【问题描述】:

一段时间以来,我一直在将我的项目从 CodeIgniter3 移植到 CodeIgniter4。我现在正处于我想以 PDF 格式吐出一些信息的阶段。我曾经在 CI3 中使用 dompdf 库没有任何问题。我在 CI4 中撞到了一堵混凝土墙。

我按照this tutorial 中的说明完成了步骤 1 到 4,但存在以下偏差

在app/Config/Autoload.php中,我是这样注册dompdf服务的:

public $psr4 = [
    APP_NAMESPACE => APPPATH, // For custom app namespace
    'Config'      => APPPATH . 'Config',
    //'Dompdf'    => APPPATH . 'ThirdParty/dompdf/src',
    //not like this ^^^
    'Dompdf'      => APPPATH . 'ThirdParty/vendor/dompdf/dompdf/src', <-- like this
];

我的控制器看起来像这样

<?php
namespace App\ThirdParty;
namespace App\Controllers;

use Dompdf\Dompdf;
use CodeIgniter\Controller;

class AjaxDomPDF extends Controller

  function htmlToPDF($view)
    $dompdf = new \Dompdf\Dompdf();
    $dompdf->loadHtml(view($view));
    $dompdf->setPaper('A4', 'landscape');
    $dompdf->render();
    $dompdf->stream();
  

我在 app/Config/Routes.php 文件中的路由条目是

$routes->get('generatePDF/(:segment)', 'AjaxDomPDF::htmlToPDF/$1');

有了这个安排,我得到了错误

找不到类“Dompdf\Cpdf”

我觅食并the best solution seemed to be this,因此我将控制器编辑为如下所示

<?php
namespace App\ThirdParty;
namespace App\Controllers;

require 'vendor/autoload.php';
require 'vendor/dompdf/dompdf/lib/Cpdf.php';

use Dompdf\Dompdf;
// disable DOMPDF's internal autoloader if you are using Composer
define('DOMPDF_ENABLE_AUTOLOAD', false);
define("DOMPDF_ENABLE_REMOTE", true);

// include DOMPDF's default configuration
require_once 'vendor/dompdf/dompdf/dompdf_config.inc.php';

use CodeIgniter\Controller;

class AjaxDomPDF extends Controller

  function htmlToPDF($view)
    $dompdf = new \Dompdf\Dompdf();
    $dompdf->loadHtml(view($view));
    $dompdf->setPaper('A4', 'landscape');
    $dompdf->render();
    $dompdf->stream();
  


有了这个我现在得到错误

require(vendor/autoload.php):打开流失败:没有这样的文件或目录

我搜索并找到了this similar question,但到目前为止没有答案,似乎解决了我的问题。

【问题讨论】:

你是如何安装这些包的?使用composer install? 是的!我用作曲家。我发出了命令'composer require dompdf/dompdf' 你尝试过什么来解决这个错误?这些文件安装在哪里? 我完全被卡住了!我不明白为什么解析器说文件不存在。给出的路径是正确的,文件在那里。 我遇到了a similar problem for someone 并注意到他们将 APPPATH 常量预先挂在控制器中提到的文件的相对路径中。这行得通!所以 > 需要 'vendor/autoload.php';变为 > 需要 APPPATH.'vendor/autoload.php';现在我不认为这是答案,因为我不知道为什么明显正确的相对路径不起作用。如果有人可以解释这一点,那就应该是答案。 【参考方案1】:

如果您在 Codeigniter 站点的根目录中运行此命令 (composer require dompdf/dompdf),则只需从 更改 app/Config/Autoload.php 文件中的 DomPdf 路径应用程序路径。 'ThirdParty/vendor/dompdf/dompdf/src''/vendor/dompdf/src' 像这样:

public $psr4 = [
    APP_NAMESPACE => APPPATH, // For custom app namespace
    'Config'      => APPPATH . 'Config',
    'Dompdf'    =>  '/vendor/dompdf/src',
];

解释: 当您运行composer 命令时,Composer 在当前目录(其中您在执行任何composer 命令之前在命令行中输入)并将需求下载到此目录中。

更新:

当您执行composer 命令时,会在当前目录中创建或更新自己的供应商目录。因此,首先您使用 Composer 使用以下命令创建一个新的 CI4 项目: composer create-project codeigniter4/appstarter


然后 Composer 也会为当前环境创建一个“config”目录,其中包括类映射、PSR-4 自动加载等...现在在 vendor/composer 目录中有一个 autoload_psr4.php 命令执行时生成的文件。此文件包含所有要求(composer require &lt;example&gt;composer.json 文件中的 "require"-block 均找到。


现在在 /project-root-directory/vendor/composer/autoload_psr4.php 文件中包含 Codeigniter 命名空间! 之后 - 因为您编写了 - 您的 Dompdf 库及其要求,可在 /project-root-directory/app/ThirdParty/vendor/ 中找到。如果您在 /app/ThirdParty/ 目录中执行下一个命令,这是可能的: composer require dompdf/dompdf

当出现以下问题时,您按 nNoNo composer.json in current directory, do you want to use the one at /project-root-directory? [Y,n]?

否则 Dompdf 及其要求将安装到项目根目录中的一级供应商目录中。


当您执行上面的命令时,在 app/ThirdParty/vendor/ 目录中只包含! Dompdf 及其要求,什么都没有否则,您可以使用 use CodeIgniter\Controller; 加载 Codeigniter\Controller 类,但 use Dompdf\Dompdf; 不起作用,因为 Dompdf 供应商目录与 Codeigniter 框架不同 供应商目录因此无法相互通信。

【讨论】:

对不起,你没有回答这个问题......其他一切都保持不变,即我上面所说的 app/Config/Autoload.php 没有变化,我的问题简单地解决了通过将常量 APPPATH 预先附加到控制器中的相对正确路径。为什么?为什么这些正确的路径(在控制器中)不起作用,除非我们在它们前面加上常量 APPPATH?现在问题已经降级到这个了? 您的 app/ThirdParty 目录是否包含 vendor 目录并且包含 dompdf 目录? @owino 您首先链接的教程是正确的,但我认为作者忘记留下警告,他/她将 vendor 目录重定向到 应用/第三方位置 是的,如果你像我一样使用composer安装,app/ThirdParty目录包含vendor目录。 dompdf文件的路径是app/ThirdParty/vendor/dompdf/dompdf/

以上是关于要求(供应商/autoload.php):无法打开流:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5 中打开 autoload.php 失败

我无法使用 phpunit 进行测试:无法打开文件“autoload.php”

避免作曲家的autoload.php解析所有文件

安装 Sylius 时出错:“PHP 致命错误:require():无法打开所需的 autoload.php”

什么原因'警告:require(C:\wamp64\www\laravel\bootstrap/../vendor/autoload.php) 无法打开流:

警告:无法打开流:第 17 行的 C:\wamp\www\laravel\bootstrap\autoload.php 中没有这样的文件或目录