簡體   English   中英

要求(供應商/autoload.php):無法打開 stream:沒有這樣的文件或目錄

[英]require(vendor/autoload.php): failed to open stream: No such file or directory

一段時間以來,我一直在將我的項目從 CodeIgniter3 移植到 CodeIgniter4。 我現在正處於想在 PDF 中吐出一些信息的階段。 我曾經在 CI3 中使用 dompdf 庫沒有任何問題。 我在 CI4 中撞到了一堵混凝土牆。

我按照本教程中的說明完成了步驟 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
];

我的 controller 看起來像這樣

<?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');

有了這個安排,我得到了錯誤

Class 'Dompdf\Cpdf' 未找到

我覓食,最好的解決方案似乎是這個,因此我編輯了我的 controller 如下

<?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();
  }
}

有了這個,我現在得到了錯誤

要求(供應商/autoload.php):無法打開 stream:沒有這樣的文件或目錄

我搜尋並發現了這個類似的問題,但到目前為止,那里沒有答案似乎可以解決我的問題。

如果您在 Codeigniter 站點的根目錄中運行此命令( composer require dompdf/dompdf ),那么您只需從 APPPATH 更改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

當出現以下問題時,您按nNo No composer.json in current directory, do you want to use the one at /project-root-directory? [Y,n]?

否則,將Dompdf及其要求安裝到項目根目錄中的第一級供應商目錄中。


當你執行上面的命令時,在app/ThirdParty/vendor/目錄下只包含! Dompdf及其要求,因此您可以使用 CodeIgniter\Controller 加載 Codeigniter \Controller class use CodeIgniter\Controller; use Dompdf\Dompdf; 不起作用,因為Dompdf供應商目錄與Codeigniter 框架供應商目錄不同,因此無法相互通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM