ambengers / eloquent-pdf
Laravel 包,用于使用 Eloquent ORM 依赖创建 PDF 文件。
Requires
- php: ^8.0
- barryvdh/laravel-snappy: ^1.0.0
- illuminate/support: ^9|^10
- spatie/laravel-medialibrary: ^10.0
Requires (Dev)
- orchestra/testbench: ^7.0|^8.0
- phpunit/phpunit: ^9.5
README
此包提供了一个优雅的方式来使用 Eloquent 模型生成 PDF。使用 Laravel Snappy 生成 PDF,并使用 Laravel Medialibrary 将 PDF 作为模型媒体关联。
Spatie Media Library 版本兼容性
安装
通过 Composer
$ composer require ambengers/eloquent-pdf
可选,您可以通过运行以下命令发布配置文件。
php artisan vendor:publish --tag=eloquent-pdf-config
用法
Eloquent PDF 类
您可以使用以下命令生成 Eloquent PDF 类。
$ php artisan make:eloquent-pdf PostPdf
默认情况下,该类将位于 App\Pdf
命名空间中。您可以在配置文件中自定义此设置。
您的 Eloquent PDF 类将包含 2 个方法
getData()
提供用于视图的数据getView()
PDF 模板文件的视图名称
namespace App\Pdf; class PostPdf extends AbstractEloquentPdf { public function getData() : array { return [ 'title' => $this->model->title, 'body' => $this->model->body, ]; } public function getView() : string { return 'posts.pdf'; } }
现在您可以从控制器(或应用中的任何位置)使用 Eloquent PDF 类。
下载 PDF
return app(PostPdf::class) ->model($post) ->download() ->handle();
打印预览 PDF
return app(PostPdf::class) ->model($post) ->stream() ->handle();
Eloquent PDF 与 Media Library
此包还提供了使用 Media Library 包将 PDF 文件关联到 Eloquent 模型的一种优雅方式。为此,您需要在您的 Eloquent PDF 类上使用一个特质。
use Ambengers\EloquentPdf\InteractsWithMediaLibrary; class PostPdf extends AbstractEloquentPdf { use InteractsWithMediaLibrary; }
然后在您的控制器中,就像在 media library 中做的那样,只需提供 PDF 文件将要关联的集合名称。
return app(PostPdf::class) ->model($post) ->toMediaCollection('reports') ->handle();
为了提供额外的便利,您还可以链式调用其他 media library 方法。
return app(PostPdf::class) ->model($post) ->toMediaCollection('reports') ->withCustomProperties(['foo' => 'bar']) ->withAttributes(['creator_id' => auth()->id()]) ->handle();
在幕后,Eloquent PDF 将将这些方法调用转发到 media library 的 FileAdder::class
,这样您就可以进一步利用其功能。
自定义
如果您需要进一步的自定义,例如更改默认 PDF 文件名、扩展名或设置 PDF 选项,您可以覆盖 Eloquent PDF 类中的某些方法。
namespace App\Pdf; class PostPdf extends AbstractEloquentPdf { public function getOrientation(): string { return 'landscape'; } public function getOptions(): array { return [ 'footer-right' => 'Right footer text goes here!', 'footer-font-size' => 8, 'encoding' => 'UTF-8', ]; } public function getFilename(): string { return 'new-file-name'; } public function getExtension(): string { return 'odt'; } }
或者,如果您只想在运行时进行自定义,可以在调用 Eloquent PDF 类时链式调用一些设置方法。
return app(PostPdf::class) ->model($post) ->orientation('landscape') ->options(['footer-font-size' => 8]) ->filename('some-cool-filename') ->toMediaCollection('reports') ->handle();
安全
如果您发现任何安全相关的问题,请通过作者电子邮件而不是使用问题跟踪器来联系作者。
许可证
有关更多信息,请参阅许可证文件。