最近、Laravel + Eloquentのプロジェクトで、印刷可能な形式のドキュメント(請求書、Word形式の契約書)を作成する必要がありました。システムにはさまざまなドキュメントがあるので、後で他のプロジェクトで使用できるように、ユニバーサルにすることにしました。
その結果、プロジェクトへの統合に最小限のコストを必要とする実装が実現します。

私が印刷可能なフォームを作成するために使用したように。さまざまなアプローチを使用
- ドキュメントテンプレートにタグを配置し、生成中にそれらを置き換えました。
- .
- html word.
- , , .
. Eloquent, , .
,
composer require mnvx/eloquent-print-form
Eloquent, . , .
use Illuminate\Database\Eloquent\Model;
/**
* @property string $number
* @property string $start_at
* @property Customer $customer
* @property ContractAppendix[] $appendixes
*/
class Contract extends Model
{
public function customer()
{
return $this->belongsTo(Customer::class);
}
public function appendixes()
{
return $this->hasMany(ContractAppendix::class);
}
}
/**
* @property string $name
* @property CustomerCategory $category
*/
class Customer extends Model
{
public function category()
{
return $this->belongsTo(CustomerCategory::class);
}
}
/**
* @property string $number
* @property string $date
* @property float $tax
*/
class ContractAppendix extends Model
{
public function getTaxAttribute()
{
$tax = 0;
foreach ($this->items as $item) {
$tax += $item->total_amount * (1 - 100 / (100+($item->taxStatus->vat_rate ?? 0)));
}
return $tax;
}
}
,

(Contract), (Customer), . (ContractAppendix).
— . docx

Eloquent. , , , ${customer.category.name}.
, |, ${number|placeholder}. , , ${start_at|date|placeholder}.
placeholder— "____",date— 24.12.2020,dateTime— - 24.12.2020 23:11,int— 2`145,decimal— 2`145.07.
. ${entities.#row_number}.
ドキュメントが説明されたので、印刷可能なものの生成を開始するだけです。
use Mnvx\EloquentPrintForm\PrintFormProcessor;
$entity = Contract::find($id);
$printFormProcessor = new PrintFormProcessor();
$templateFile = resource_path('path_to_print_forms/your_print_form.docx');
$tempFileName = $printFormProcessor->process($templateFile, $entity);
生成されたファイル$tempFileNameには、準備された印刷可能ファイルが含まれます。
Laravelプロジェクトでは、印刷可能なものの生成を担当するコントローラーメソッドは次のようになります。
public function downloadPrintForm(FormRequest $request)
{
$id = $request->get('id');
$entity = Contract::find($id);
$printFormProcessor = new PrintFormProcessor();
$templateFile = resource_path('path_to_print_forms/your_print_form.docx');
$tempFileName = $printFormProcessor->process($templateFile, $entity);
$filename = 'contract_' . $id;
return response()
->download($tempFileName, $filename . '.docx')
->deleteFileAfterSend();
}
要約すると、印刷可能なフォームがたくさんあるプロジェクトでこの小さなライブラリを作成することで、私はきちんと自分自身をオフロードしたと言えます。それぞれに独自のコードを書く必要はありません。上記のように変数を説明するだけで、結果をすばやく取得できます。パッケージが時間を節約するのに役立つなら、私はうれしいです。