blocs/admin: 定義ファイルの作成と管理画面の自動生成
blocs/admin: 定義ファイルの作成と管理画面の自動生成
自動生成ツールは、JSON形式の定義ファイルをもとに管理画面のコントローラー・ビュー・ルーティング・モデル・マイグレーションを一括生成します。このドキュメントでは、定義ファイルの書き方と自動生成コマンドの使い方を説明します。
前提条件: blocs/admin がインストール済みであること(No.1.1 を参照)
自動生成の実行方法
1. 定義ファイルの作成
JSON形式の定義ファイルを docs/develop/ に保存します(例: docs/develop/sample.json)。
2. Artisan コマンドの実行
php artisan blocs:develop docs/develop/sample.json
コマンド実行時に自動で行われる処理
- ベースコントローラーを継承したコントローラー生成
routes/web.phpへのルート追加(標準管理画面のルートはroutes/admin.php。自動生成画面のみweb.phpに追記される)config/menu.phpへのメニュー追加- モデル生成
- データベース定義ファイル生成
- マイグレーション実行
- テンプレート生成
php artisan migrate を別途実行する必要はありません。
自動生成後に利用できる基本機能
| 機能 | メソッド(ルート名) | 処理内容 | テンプレート |
|---|---|---|---|
| 一覧表示 | index | 登録データの一覧を表示 | index.blocs.html |
| 一覧表示 | search | 条件を指定して検索結果を一覧表示 | index.blocs.html |
| 新規作成 | create | 新規登録用入力画面を表示 | create.blocs.html |
| 新規作成 | store | 入力データを保存 | なし |
| 編集 | edit | 既存データを編集する画面を表示 | edit.blocs.html |
| 編集 | update | 編集内容を更新 | なし |
| 削除 | show | 削除前確認画面を表示 | show.blocs.html |
| 削除 | destroy | 指定データを削除 | なし |
| ファイル操作 | upload | ファイルをアップロード | なし |
| ファイル操作 | download | ファイルをダウンロード | なし |
| ファイル操作 | thumbnail | サムネイルを表示 | なし |
| 一括削除 | select | 複数データの一括削除 | なし |
| ステータス切り替え | toggle | データの状態を切り替え | なし |
定義ファイルの形式(JSON)
定義ファイルは以下の4つのセクションで構成されます。
| キー項目 | 説明 |
|---|---|
| controller | コントローラーに関する設定 |
| form | 入力フォームの定義 |
| menu | メニューの表示設定 |
| route | ルーティングの設定 |
controller セクション
| キー項目 | 説明 | 例 |
|---|---|---|
| controllerName | コントローラーのクラス名 | Admin/SampleController |
| viewPrefix | ビューのパス(ドット区切り) | admin.sample |
| modelName | モデルの名前 | Admin/Sample |
| loopItem | 一覧表示で使用するテーブル名 | samples |
| paginateNum | 1ページの表示件数(0でページングなし) | 20 |
| noticeItem | 操作完了メッセージに使う項目名 | name |
controllerName と modelName は Admin/ プレフィックス付き(例: Admin/SampleController)を推奨します。サブ名前空間なし(例: CompanyController)も動作しますが、生成先の名前空間と一致させてください。
form セクション
フォーム名をキーとした連想配列で、各入力項目を定義します。
テキスト入力タイプ(text, textarea, datepicker, timepicker, number)
| キー項目 | 説明 | 記述例 |
|---|---|---|
| type | 入力タイプ | text |
| label | 表示ラベル | 名前 |
| required | 必須入力かどうか | true |
| placeholder | プレースホルダー | 入力してください |
| disabled | 入力不可にするか | false |
| readonly | 読み取り専用にするか | false |
選択入力タイプ(select, radio, checkbox)
| キー項目 | 説明 | 記述例 |
|---|---|---|
| type | 入力タイプ | checkbox |
| label | 表示ラベル | 仕事 |
| required | 必須入力かどうか | true |
| option | 選択肢(値とラベルの連想オブジェクト、またはラベルのみの配列) | "1": "学生", "2": "会社員" または ["有効", "無効"] |
| default | 初期選択値 | [1, 2] |
検索できるプルダウン(select2)
| キー項目 | 説明 | 記述例 |
|---|---|---|
| type | 入力タイプ | select2 |
| label | 表示ラベル | 仕事 |
| option | 選択肢 | "1": "学生", "2": "会社員" |
| default | 初期選択値 | [1, 2] |
| required | 必須入力かどうか | true |
| multiple | 複数選択可能か | true |
ファイルアップロード(upload)
| キー項目 | 説明 | 記述例 |
|---|---|---|
| type | 入力タイプ | upload |
| label | 表示ラベル | アップロードファイル |
| required | 必須入力かどうか | true |
| multiple | 複数ファイルのアップロード可否 | true |
option の記述形式
option は次の2形式のいずれかで記述します。
| 形式 | 記述例 | 補足 |
|---|---|---|
| 連想オブジェクト | "1": "学生", "2": "会社員" |
value と label を明示(推奨) |
| 配列 | ["有効", "無効"] |
0 始まりの連番が value として自動採番 |
入力タイプ一覧
| type | 説明 |
|---|---|
| text | 1行テキスト入力 |
| textarea | 複数行テキスト入力 |
| datepicker | 日付入力 |
| timepicker | 日付+時間入力 |
| number | 数値入力 |
| select | プルダウン選択 |
| radio | ラジオボタン |
| checkbox | チェックボックス |
| select2 | 検索機能付きプルダウン |
| upload | ファイルアップロード |
menu セクション
| 設定項目 | 説明 | 記述例 |
|---|---|---|
| name | メニューがリンクするルート名 | admin.sample.index |
| lang | メニューに表示するラベル | サンプル |
| icon | Font Awesomeのアイコンクラス名 | fa-cogs |
| role | true にすると権限チェックをスキップして常に表示(省略時は config/role.php で権限のあるロールにのみ表示。詳しくは No.3.4) |
true |
route セクション
| 設定項目 | 説明 | 記述例 |
|---|---|---|
| routePrefix | URLの共通パス | admin/sample |
| routeName | ルート名の共通プレフィックス | admin.sample. |
サンプル: 企業情報の管理画面
{
"controller": {
"controllerName": "CompanyController",
"viewPrefix": "admin.company",
"modelName": "Company",
"loopItem": "companies",
"paginateNum": 20,
"noticeItem": "name"
},
"form": {
"code": {
"label": "証券番号",
"type": "text",
"required": true
},
"name": {
"label": "名前",
"type": "text",
"required": true
}
},
"menu": {
"name": "admin.company.index",
"lang": "企業",
"icon": "fa-building"
},
"route": {
"routePrefix": "admin/company",
"routeName": "admin.company."
}
}
サンプル: ソリューション管理画面(ステータス・選択肢あり)
{
"controller": {
"controllerName": "Admin/SolutionController",
"viewPrefix": "admin.solution",
"modelName": "Admin/Solution",
"loopItem": "solutions",
"paginateNum": 20,
"noticeItem": "name"
},
"form": {
"disabled_at": {
"label": "ステータス",
"type": "radio",
"option": {
"0": "有効",
"1": "無効"
},
"default": "0",
"required": true
},
"name": {
"label": "名前",
"type": "text",
"required": true
},
"pattern": {
"label": "パターン",
"type": "select",
"option": {
"A": "パターンA",
"B": "パターンB"
},
"required": true
}
},
"menu": {
"name": "admin.solution.index",
"lang": "ソリューション",
"icon": "fa-tag",
"role": true
},
"route": {
"routePrefix": "admin/solution",
"routeName": "admin.solution."
}
}
QA
入力フォームを必須項目にしたい場合
BLOCS テンプレートでは data-validate(省略記法 !name)でバリデーションを指定します(詳しくは No.2.10 を参照)。
<input type="text" name="name">
<!-- !name="required" data-lang="必須入力です。" -->
@error("name")
<div class="invalid-feedback">{{ $message }}</div>
@enderror
自動生成ルートのミドルウェア
blocs:develop が routes/web.php に追記するルートテンプレート(develop/route.php)は、['auth', Blocs\Middleware\Role::class] のみを指定します。web は含めません。
Laravel は routes/web.php に登録されたルートへ web ミドルウェア(セッション・Cookie・CSRF 保護)を自動付与します。テンプレート側で web を追加すると二重に適用されるため、付けないでください(No.1.2 参照)。
一方、同梱の routes/admin.php は AdminServiceProvider の loadRoutesFrom() で読み込まれるため web は自動付与されません。こちらは各ルートグループで ['web', 'auth', ...] と 明示的に web を指定してください。