เพราะว่ามี json ที่ export ทำไว้สำหรับให้ Vue.js หรือ JQuery ดึงข้อมูลไปใช้ เช่น ตัวเลือก options ใน select box ที่ใช้หลายที่ แต่บางครั้งนาน ๆ ทีจะมีการ update ข้อมูลบ้าง เลยเขียน code เอาไว้ update ข้อมูล และใช้ dynamic model ในการช่วยดึงข้อมูล อันนี้จะต่างจากแคชปกติของ laravel เพราะว่าจะเขียนไฟล์ไว้ใน SourceCode/public/assets/options เพราะต้องให้ javascript ทั้ง jQuery, React, Vue.js พวกนี้เข้ามาอ่านข้อมูลได้โดยที่ไม่ query ใหม่ ไม่ต้องใช้ PHP สร้างใหม่ทุกครั้ง หรือต้องมาตรวจดูข้อมูลทุกครั้งที่มีการใช้งาน จึงใช้เฉพาะส่วนที่เป็น public ได้เท่านั้น
- สร้าง Controller
SourceCode/app/Http/Controllers/AssetCacheController.php
อธิบาย
บรรทัดที่ 21 เป็นการ load model แบบ dynamic ตามชื่อ model ที่ส่งมา
บรรทัดที่ 24 เป็น function ที่ดึงข้อมูล option ที่เขียนเพิ่มไว้ใน model
บรรทัดที่ 61 เป็นส่วนที่เขียนไว้ว่า key ไหน ให้ไปดึงข้อมูลจาก model อะไร123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107<?php
namespace
App\Http\Controllers;
use
Illuminate\Http\Request;
class
AssetCacheController
extends
Controller
{
/**
* cacheSelectOptions
*
* @param string $key The key to use for the cache file
* @param string $model The model to get the options from
* @return write the options to a json file
*
* create a json file with the data from the model for the select option
*/
public
function
cacheSelectOptions(
$key
,
$model
)
{
// Perform operations with the model
$modelClass
=
"App\\Models\\{$model}"
;
if
(
class_exists
(
$modelClass
)) {
if
(method_exists(
$modelClass
,
'getOptions'
)) {
$options
= (
new
$modelClass
)->getOptions();
$filePath
= public_path(
'assets/options/'
.
$key
.
'.json'
);
file_put_contents
(
$filePath
, json_encode(
$options
));
}
else
{
\Log::error(
'AssetCacheController: Method getOptions() not found in model: '
.
$model
);
}
}
else
{
\Log::error(
'AssetCacheController: Model '
.
$model
.
' not found'
);
}
}
/**
* getSelectOptions
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*
* create a json file with the data from the model for the select option and return the data
*/
public
function
getSelectOptions(Request
$request
)
{
// Validate the request
$validator
= \Validator::make(
$request
->all(), [
'key'
=>
'required|string'
,
]);
if
(
$validator
->fails()) {
return
response()->json([
'error'
=>
$validator
->errors()], 400);
}
// Get configuration
$key
=
$request
->input(
'key'
);
switch
(
$key
) {
case
'category_id'
:
$model
=
'Category'
;
break
;
case
'organization_id'
:
$model
=
'Organization'
;
break
;
case
'service_line_id'
:
$model
=
'ServiceLine'
;
break
;
case
'status_id'
:
$model
=
'Status'
;
break
;
case
'team_id'
:
$model
=
'Team'
;
break
;
case
'team_support_id'
:
$model
=
'TeamUser'
;
break
;
case
'vessel_id'
:
$model
=
'Vessel'
;
break
;
default
:
\Log::error(
'AssetCacheController: no assets configuration for '
.
$key
);
return
response()->json([
'error'
=>
'Internal server error'
], 500);
break
;
}
$this
->cacheSelectOptions(
$key
,
$model
);
$filePath
= public_path(
'assets/options/'
.
$key
.
'.json'
);
if
(
file_exists
(
$filePath
)) {
$options
= json_decode(
file_get_contents
(
$filePath
), true);
return
response()->json(
$options
);
}
else
{
return
response()->json([
'error'
=>
'Cache file not found'
], 404);
}
}
}
- สร้าง routes API โดยคำสั่ง
php artisan install:api
- เพิ่ม rute
Route::get('asset/getSelectOptions', [AssetCacheController::class, 'getSelectOptions']);
- test โดยลองเรียก url เช่น
http://127.0.0.1:8000/api/asset/getSelectOptions?key=category_id
ควรจะมี ไฟล์ SourceCode/public/assets/options/category_id ถูกสร้าง / อัพเดตตามข้อมูลในตาราง ณ ขณะนี้