要求(供应商/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 <example>
和 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
当出现以下问题时,您按 n 为 No。
No 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”
安装 Sylius 时出错:“PHP 致命错误:require():无法打开所需的 autoload.php”
什么原因'警告:require(C:\wamp64\www\laravel\bootstrap/../vendor/autoload.php) 无法打开流:
警告:无法打开流:第 17 行的 C:\wamp\www\laravel\bootstrap\autoload.php 中没有这样的文件或目录