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 が追記するルートテンプレート(develop/route.php)は ['web', 'auth', Blocs\Middleware\Role::class] を指定してください。web を省略するとセッション・CSRF 保護が効きません。