首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何组织PDF相关代码,使其不在路由文件中?

如何组织PDF相关代码,使其不在路由文件中?
EN

Stack Overflow用户
提问于 2018-12-20 08:55:46
回答 1查看 103关注 0票数 0

我使用的是Laravel Snappy PDF包barryvdh/laravel-snappy

这一切都运行得很好,但是routes文件现在有很多我想要从routes文件中清理出来并放在其他地方的信息。

代码语言:javascript
复制
Route::get('services/{service}/overview', function ($id) {
    $service = \App\Service::where('id', '=', $id)->first();
    $service->load('sbo_name', 'sbm_name', 'stm_name', 'get_lifecycle_status', 'items', 'environments', 'agreements', 'supported_services', 'required_services', 'serviceDependencies', 'readiness');
    $data['service'] = $service->toArray();
    $pdf = PDF::loadView('reports.services.overview', $data)
        ->setPaper('a4')
        ->setOrientation('portrait')
        ->setOption('footer-right', 'Page [page] of [toPage]     ')
        ->setOption('footer-left', '     Printed: [date]')
        ->setOption('footer-font-size', 8)
        ->setOption('footer-font-name', 'Arial')
        ->setOption('margin-top', 10)
        ->setOption('margin-left', 5)
        ->setOption('margin-right', 5)
        ->setOption('lowquality', false)
        ->setOption('dpi', 96)
        ->setOption('image-quality', 100);
    return $pdf->inline('Service Overview.pdf');
});

构建这种结构的最好方法是什么?我也不想重复每个新报告的pdf选项。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-20 13:41:30

首先,通过将路由文件移动到控制器中来清理它们。

Route::get('services/{service}/overview', ExportServiceController@show);

代码语言:javascript
复制
// app/Http/Controllers/ExportServiceController.php
class ExportServiceController extends Controller

public function show($id) {
    return (new App/ExportServicePdf)->execute($id);

}

进一步清理你的控制器,将逻辑移到它自己的类中,这样它就可以在其他控制器中重用。

代码语言:javascript
复制
// for example app/ExportServicePdf.php
namespace App;

class ExportServicePdf 
{
   public function execute($id) 
   {
    $service = \App\Service::where('id', '=', $id)->first();
    $service->load('sbo_name', 'sbm_name', 'stm_name', 'get_lifecycle_status', 'items', 'environments', 'agreements', 'supported_services', 'required_services', 'serviceDependencies', 'readiness');
    $data['service'] = $service->toArray();

    $pdf = PDF::loadView('reports.services.overview', $data)
    ->setPaper('a4')
    ->setOrientation('portrait')
    ->setOption('footer-right', 'Page [page] of [toPage]     ')
    ->setOption('footer-left', '     Printed: [date]')
    ->setOption('footer-font-size', 8)
    ->setOption('footer-font-name', 'Arial')
    ->setOption('margin-top', 10)
    ->setOption('margin-left', 5)
    ->setOption('margin-right', 5)
    ->setOption('lowquality', false)
    ->setOption('dpi', 96)
    ->setOption('image-quality', 100);
     return $pdf->inline('Service Overview.pdf');
   }

}

快速挖掘一下这个库,有一个公共方法setOptions(),它接受一组选项。

在您的ExportServicePdf类中,您可以进一步将其重构为:

代码语言:javascript
复制
class ExportServicePdf
{
   private $options = [
      'footer-font-size' => 8,
      'footer-font-name' => 'Arial',
      //...
    ];

    // Then you can do 
    public function execute($id)
    {
       $pdf = PDF::loadView('reports.services.overview', $data)
             ->setPaper('a4')
             ->setOrientation('portrait')
             ->setOptions($this->options)
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53861139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档