นี่คือวิธีที่ฉันทำหลังจากค้นคว้ามาระยะหนึ่ง ฉันต้องการสร้างจุดสิ้นสุด Laravel API ที่ตรวจสอบว่าฟิลด์ "ใช้งานอยู่" หรือไม่ดังนั้นข้อมูลที่สำคัญคือ 1) ตาราง DB ใด 2) คอลัมน์ DB อะไร และ 3) มีค่าในคอลัมน์นั้นที่ตรงกับข้อความค้นหาหรือไม่
เมื่อรู้สิ่งนี้เราสามารถสร้างอาร์เรย์เชื่อมโยงของเรา:
$SEARCHABLE_TABLE_COLUMNS = [
'users' => [ 'email' ],
];
จากนั้นเราสามารถกำหนดค่าของเราที่เราจะตรวจสอบ:
$table = 'users';
$column = 'email';
$value = 'alice@bob.com';
จากนั้นเราสามารถใช้array_key_exists()
และin_array()
ร่วมกันเพื่อดำเนินการคำสั่งผสมหนึ่งสองขั้นตอนแล้วดำเนินการตามtruthy
เงื่อนไข:
// step 1: check if 'users' exists as a key in `$SEARCHABLE_TABLE_COLUMNS`
if (array_key_exists($table, $SEARCHABLE_TABLE_COLUMNS)) {
// step 2: check if 'email' is in the array: $SEARCHABLE_TABLE_COLUMNS[$table]
if (in_array($column, $SEARCHABLE_TABLE_COLUMNS[$table])) {
// if table and column are allowed, return Boolean if value already exists
// this will either return the first matching record or null
$exists = DB::table($table)->where($column, '=', $value)->first();
if ($exists) return response()->json([ 'in_use' => true ], 200);
return response()->json([ 'in_use' => false ], 200);
}
// if $column isn't in $SEARCHABLE_TABLE_COLUMNS[$table],
// then we need to tell the user we can't proceed with their request
return response()->json([ 'error' => 'Illegal column name: '.$column ], 400);
}
// if $table isn't a key in $SEARCHABLE_TABLE_COLUMNS,
// then we need to tell the user we can't proceed with their request
return response()->json([ 'error' => 'Illegal table name: '.$table ], 400);
ฉันขอโทษสำหรับโค้ด PHP เฉพาะของ Laravel แต่ฉันจะทิ้งมันไว้เพราะฉันคิดว่าคุณสามารถอ่านเป็นรหัสหลอกได้ ส่วนที่สำคัญคือสองif
คำสั่งที่ดำเนินการพร้อมกัน
array_key_exists()
และin_array()
เป็นฟังก์ชัน PHP
แหล่งที่มา:
สิ่งที่ดีเกี่ยวกับขั้นตอนวิธีการที่ผมแสดงให้เห็นข้างต้นคือการที่คุณสามารถทำให้ปลายทางเช่น REST GET /in-use/{table}/{column}/{value}
(ที่table
, column
และvalue
เป็นตัวแปร)
คุณสามารถมี:
$SEARCHABLE_TABLE_COLUMNS = [
'accounts' => [ 'account_name', 'phone', 'business_email' ],
'users' => [ 'email' ],
];
จากนั้นคุณสามารถส่งคำขอ GET เช่น:
GET /in-use/accounts/account_name/Bob's Drywall
(คุณอาจต้องเข้ารหัส uri ส่วนสุดท้าย แต่โดยปกติจะไม่)
GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/alice@bob.com
สังเกตด้วยว่าไม่มีใครสามารถทำได้:
GET /in-use/users/password/dogmeat1337
เพราะไม่ได้อยู่ในรายชื่อของคอลัมน์ได้รับอนุญาตให้password
user
ขอให้โชคดีในการเดินทาง