1. Laravel とは
Laravel は PHP で書かれたオープンソースの Web アプリケーションフレームワークです。2011 年に Taylor Otwell によって作られ、現在では PHP フレームワークの中で最も人気のあるものの一つとなっています。MVC(Model-View-Controller)アーキテクチャを採用しており、ビジネスロジック・データ・表示を分離して開発できます。
1.1 主要な機能
| 機能 | 説明 |
| Eloquent ORM | データベース操作をオブジェクト指向で直感的に扱える。SQLをほとんど書かずにDB操作が可能 |
| Blade テンプレート | シンプルかつ強力なテンプレート構文。HTMLとPHPを綺麗に分離 |
| Artisan | コマンドラインツール。コードの自動生成・マイグレーション・キャッシュクリアを効率化 |
| ルーティング | Route::get(‘/users’, …) のような直感的な記述でURLとコントローラーを結びつける |
| 認証(Auth) | ログイン・登録・パスワードリセットなどの認証機能を標準装備 |
| マイグレーション | データベース構造のバージョン管理 |
| キューと スケジューラ | 非同期処理・タスクの定期実行 |
2.Composer による依存管理
2.1 Composer とは
Composer は PHP の依存管理ツールです。JavaScript の npm、Python の pip に相当します。Laravel 自体も Composer を使ってインストール・管理されます。「アプリの部品調達係」と考えると理解しやすいです
2.2 Composer の3つの役割
- 買い物リストの管理: composer.json = 「このアプリに必要な部品リスト」
- 部品の調達と配置: Packagist からライブラリを取得して vendor/ に配置
- 部品同士の互換性チェック: バージョン矛盾がないか自動確認
2.3 ライブラリの所在
| 場所 | 役割 |
| Packagist (packagist.org) | PHPライブラリのカタログ(Amazonのサイトに相当) |
| GitHub | 実際のソースコードの置き場所(Amazonの倉庫に相当) |
| vendor/ フォルダ | あなたのPCに取ってきた完成品(自宅に届いた荷物) |
| ローカルキャッシュ | 一度落としたものの控え(物置に置いてある予備) |
2.4 よく使うコマンド
composer install # composer.lock通りにインストール
composer update # 制約内で更新
composer require guzzlehttp/guzzle # 新規パッケージ追加
composer remove vendor/package # パッケージ削除
composer dump-autoload # オートローダーの再生成
3.ライブラリの選定基準
3.1 評価軸(重要度順)
| 観点 | 確認場所 | 重要度 |
| メンテナンスの活発さ | GitHubの最終コミット日・Issue対応状況 | ★★★ |
| ダウンロード数・利用実績 | Packagistの月間DL数 | ★★★ |
| GitHub Stars | GitHubのスター数 | ★★☆ |
| ライセンス | composer.jsonのlicense欄 | ★★★ |
ドキュメントの質 | GitHubのREADME | ★★☆ |
| Laravel公式・コミュニティ標準か | Laravel News・ブログ記事 | ★★★ |
| 依存ライブラリの少なさ | composer.jsonのrequire欄 | ★★☆ |
印刷・PDF出力 実装ガイドライン
基本方針
このプロジェクトでは、PDF生成ライブラリ(dompdf, snappy, browsershot等)を使用せず、ブラウザの印刷機能(Ctrl+P / Cmd+P)を利用したPDF出力・印刷を採用しています。
- ❌ PDF生成ライブラリは使用しない
- ✅ 印刷・PDF化はユーザーのブラウザに任せる
- ✅ 画面表示(スクリーン)と印刷(プリント)で見た目を明確に分離する
- ✅ モノクロ印刷を前提に、色に頼らず罫線・太字・濃淡で情報を区別する
2. 用紙サイズの使い分けルール
| 用紙 | 用途 | 目安列数 |
| A4縦 | 列数が少ない一覧、明細表 | 5〜7列程度まで |
| A4横 | 中程度の一覧表 | 8〜12列程度 |
| A3横 | 大規模なデータ出力、横長の集計表 | 13列以上 |
3. 必須実装ルール
3.1 ページ設定(@page)
@page { size: A4 portrait; margin: 15mm 10mm; }
@page { size: A4 landscape; margin: 10mm; }
@page { size: A3 landscape; margin: 10mm; }
3.2 テーブルの基本ルール(最重要)
一覧表の印刷品質を決める核心部分です。以下を必ず守ってください。
- • table に width: 100%; border-collapse: collapse; を設定
- • th, td に border: 0.5pt solid #000; を設定
- • thead を使い display: table-header-group; で各ページに繰り返す
- • tr に page-break-inside: avoid; で行の途中で改ページしない
- • 数値列は text-align: right; font-variant-numeric: tabular-nums;
- • 合計行は font-weight: bold; border-top: 1.5pt solid #000;
3.3 モノクロ前提の配色
色だけで情報を区別しない。太字、罫線の太さ、記号で区別します。
/* 悪い例: 色だけで区別 */
<span class="text-red-500">未払</span>
/* 良い例: 記号+テキストで区別 */
<span class="status">● 未払</span>
3.4 印刷不要要素の非表示
@media print {
nav, aside, .sidebar, .btn, button, .pagination, .no-print {
display: none !important;
}
}
3.2 PDF生成ライブラリの比較例
PDF生成は「鬼門」と言われるほど難しい分野です。文字化けや不安定さの原因の多くは、ライブラリそのものではなく、日本語フォント設定・CSS制限・サーバー環境に起因します。
| ライブラリ | 特徴 | 日本語対応 |
| barryvdh/laravel-dompdf | 最も定番。HTML→PDFが簡単。PHPだけで動く CSSの再現度高い。 | 設定が必要だが可能 |
| barryvdh/laravel-snappy | Spatie製で信頼性高い。 | 可能 |
| spatie/laravel-pdf | Node.js+Chromiumが必要Node.js+Chromiumが必要 | 可能 |
3.3 ブラウザ印刷 vs サーバーPDF生成
このプロジェクトでは、PDF生成ライブラリの複雑さを回避するため、ブラウザの印刷機能(@media print)を採用しています。
| 比較項目 | ブラウザ印刷 | サーバーPDF生成 |
| 文字化け | ほぼ起きない | フォント設定が必要 |
| CSSの対応 | 最新CSS全て使用可能 | 部分的な制限あり |
| 開発の難易度 | 通常のHTML開発と同じ | 調整に時間がかかる |
| 自動化・バッチ処理 | 不可 | 可能 |
| メール添付 | 不可 | 可能 |
| サーバー負荷 | ゼロ(クライアント処理) | 高い |
4. チェックリスト(実装後に必ず確認)
| 確認項目 | 状態 |
| @page で用紙サイズと余白が指定されている | □ |
| 印刷不要な要素(ボタン、ナビ等)が非表示になる | □ |
| フォントサイズが pt 単位(本文10pt前後、表9〜10pt) | □ |
| <thead> <tbody> <tfoot> を正しく使い分け | □ |
| テーブルヘッダーが各ページに繰り返される | □ |
| 行(<tr>)の途中で改ページしない | □ |
| すべてのセルに罫線がある | □ |
| 数値列が右寄せ・等幅数字になっている | □ |
| モノクロ印刷でも情報を区別できる | □ |
| Chrome の印刷プレビューで複数ページを確認した | □ |
5. アンチパターン(やってはいけないこと)
- ❌ PDF生成ライブラリ(dompdf, snappy 等)を新たに導入する
- ❌ <thead> を使わずに1行目をそのまま <tr> で書く
- ❌ 色のみでステータスを区別する(モノクロで読めなくなる)
- ❌ 印刷時のフォントサイズを px で指定(必ず pt)
- ❌ テーブル幅を px で固定(% を使う)
- ❌ position: fixed でヘッダー固定(2ページ目以降で崩れる)
- ❌ 背景色を使ったのに print-color-adjust: exact を付け忘れる
6.共通ルーチン設計
6.1 推奨ディレクトリ構成
resources/views/
├── layouts/
│ ├── app.blade.php ← 通常画面用
│ └── print.blade.php ← 印刷用ベース
└── reports/
├── sales-list.blade.php ← 各帳票はprintレイアウトを継承
└── inventory-list.blade.php
6.2 用紙サイズの動的切り替え
クエリパラメータで用紙サイズを切り替える実装を推奨します。
Route::get('/reports/sales/print', [ReportController::class, 'print']);
// URL: /reports/sales/print?paper=a3-landscape
6.3 共通CSS(print-common.css)
CSSは必ず外部ファイルに分離し、全帳票で共通の印刷CSSを管理します。インライン記述だと帳票ごとにコピペが増えます。
public/css/
└── print-common.css ← 全帳票で共通の印刷CSS

