เพราะว่ามี 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 อะไร
<?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 ถูกสร้าง / อัพเดตตามข้อมูลในตาราง ณ ขณะนี้