Adminer คืออะไร
Adminer เป็นโปรแกรมจัดการฐานข้อมูลผ่านหน้าเว็บ ทำงานคล้าย phpMyAdmin แต่ทั้งโปรแกรมเป็นไฟล์ PHP ไฟล์เดียว ใช้ได้กับ MySQL, MariaDB, PostgreSQL, SQLite และ SQL Server เปิดดูตาราง แก้ข้อมูล รัน SQL export และ import ได้ครบ
วิธีที่หลายคนใช้กันคือโหลด adminer.php ไปวางไว้ใน public/ แล้วเปิดจากเบราว์เซอร์ ง่ายดี แต่ไฟล์นั้นเปิดจากอินเทอร์เน็ตได้ทุกคน กันได้ด้วยรหัสผ่านฐานข้อมูลอย่างเดียว และถ้าลืมลบหลังใช้เสร็จ ไฟล์ก็ค้างอยู่บนเซิร์ฟเวอร์ต่อไปเรื่อย ๆ
laravel-adminer ช่วยอะไร
laravel-adminer ครอบ Adminer ไว้ใน route ของ Laravel ผมเองก็เคยใช้ตัวนี้ ก่อนจะย้ายมาเขียนเครื่องมือของตัวเอง ได้ข้อดีเพิ่มมาสามข้อ
- ต้อง login แอปก่อน คนที่ไม่มีบัญชีในแอปจะไม่เห็นแม้แต่หน้า login ของ Adminer
- เปิดปิดด้วย
.envตั้งADMINER_ENABLED=falseแล้ว/adminerจะตอบ 404 ไม่ต้องจำว่าวางไฟล์ไว้ตรงไหน - อัปเดตผ่าน Composer Adminer มากับแพ็กเกจ ไม่ต้องโหลดไฟล์ใหม่มาวางเอง
ตอนเขียนโพสต์นี้ เวอร์ชันล่าสุดคือ 8.0.3 (กุมภาพันธ์ 2026) รองรับ Laravel 5 ถึง 13 และมี Adminer 5.0.4 รวมมาด้วย
ติดตั้ง
composer require onecentlin/laravel-adminer
php artisan vendor:publish --provider="Onecentlin\Adminer\ServiceProvider"
คำสั่ง publish สร้างไฟล์สามอย่าง
config/adminer.phpไฟล์ตั้งค่าpublic/adminer.cssธีมของ Adminer (ธีม Hever)resources/adminer/plugins/โฟลเดอร์ใส่ปลั๊กอิน
ตั้ง middleware ให้ถูก
ไฟล์ config ที่ได้มาตั้ง 'middleware' => 'auth' ไว้ ค่านี้ใช้ไม่ได้ เพราะ route ของ Adminer ไม่ได้อยู่ในกลุ่ม web จึงไม่มี session ต่อให้ login แอปไว้แล้ว เปิด /adminer ก็ยังโดนส่งกลับไปหน้า login อยู่ดี
ให้สร้าง middleware group ชื่อ adminer ใน bootstrap/app.php แล้วชี้ config ไปที่ group นี้
->withMiddleware(function (Middleware $middleware): void {
$middleware->group('adminer', [
\Illuminate\Cookie\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Auth\Middleware\Authenticate::class,
]);
})
'middleware' => 'adminer',
group นี้ไม่มีตัวตรวจ CSRF ของ Laravel ซึ่งไม่เป็นไร เพราะฟอร์มของ Adminer มี token ของตัวเองอยู่แล้ว ถ้ายังไม่ได้ login แอป จะโดนส่งไปที่ route ชื่อ login ตามปกติ
ให้เข้าได้แค่บางคน
แพ็กเกจกันแค่คนที่ยังไม่ login ถ้าแอปมีผู้ใช้หลายคน เช่นพนักงานหน้าร้านหรือลูกค้า ทุกคนที่ login ได้จะเปิด /adminer ได้หมด ให้เพิ่ม Gate เข้าไปใน group
$middleware->group('adminer', [
\Illuminate\Cookie\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Auth\Middleware\Authenticate::class,
'can:viewAdminer',
]);
public function boot(): void
{
Gate::define('viewAdminer', fn (User $user) => in_array($user->email, [
'[email protected]',
], true));
}
คนที่อยู่ในรายชื่อเข้าได้ตามปกติ คนอื่นที่ login แล้วจะได้ 403 ส่วนคนที่ยังไม่ login ก็ยังโดนส่งไปหน้า login เหมือนเดิม
เปิด /adminer
เปิด /adminer จะเจอหน้า login ของ Adminer เลือกชนิดฐานข้อมูล แล้วกรอก server, username, password และชื่อฐานข้อมูล ใช้ค่าเดียวกับ DB_HOST, DB_USERNAME, DB_PASSWORD และ DB_DATABASE ใน .env

เข้าไปแล้วจะเห็นรายชื่อตารางทั้งหมด พร้อมขนาดและจำนวนแถวโดยประมาณ (เลขที่มี ~ นำหน้า)

กด select ที่ชื่อตารางเพื่อดูข้อมูล ค้นหา เรียงลำดับ แก้ทีละแถว หรือเลือกหลายแถวแล้วลบ และ export ได้จากหน้านี้

หน้า Show structure แสดงคอลัมน์ index และ foreign key ของตาราง

ส่วน SQL command รัน SQL ได้ทุกแบบ รวมถึง JOIN หลายตาราง

ไม่อยากกรอกรหัสทุกครั้ง ใช้ autologin
ADMINER_AUTO_LOGIN=true
เปิดแล้ว Adminer จะ login ให้เองด้วยค่าของ database connection หลักของแอป ข้ามหน้า login ไปที่ฐานข้อมูลของแอปเลย สะดวกมาก แต่มีเรื่องที่ต้องรู้
- ใครเข้า
/adminerได้ ก็ได้สิทธิ์เท่ากับ user ฐานข้อมูลของแอป ไม่ต้องรู้รหัสผ่านอีกต่อไป README ของแพ็กเกจเองก็เตือนว่าให้เปิด autologin คู่กับการกันสิทธิ์เท่านั้น จึงควรใส่ Gate ไว้ด้วยเสมอ - เห็นทุกฐานข้อมูลที่ user นั้นเห็น ถ้า
DB_USERNAMEเป็นrootจะเปิดได้ทุกฐานบนเซิร์ฟเวอร์ ให้แอปใช้ user ที่มีสิทธิ์แค่ฐานของแอป ซึ่งก็ควรทำอยู่แล้ว - ปุ่ม Logout ของ Adminer ใช้ไม่ได้ กดแล้ว Adminer จะ login กลับเข้ามาทันที ถ้าจะออกให้ logout จากแอปแทน
ปิดไว้เมื่อไม่ใช้ และย้าย URL
ADMINER_ENABLED=false
ADMINER_ROUTE_PREFIX=adminer
ADMINER_ENABLED=false ทำให้แพ็กเกจไม่ลงทะเบียน route เลย ทุกคนได้ 404 บน production จะตั้งเป็น false ไว้ แล้วเปิดเฉพาะตอนต้องใช้ก็ได้
ADMINER_ROUTE_PREFIX เปลี่ยน URL จาก /adminer เป็นชื่ออื่นได้ แต่ให้ใช้ชื่อที่มีคำเดียว เช่น dbadmin ถ้าใส่หลายชั้นอย่าง tools/db หน้า Adminer ยังเปิดได้ แต่ธีมจะหาย เพราะ Adminer โหลด adminer.css แบบ relative ไปหาที่ /tools/adminer.css ถ้าอยากใช้หลายชั้นจริง ๆ ให้ copy ไฟล์ CSS ไปไว้ที่ public/tools/adminer.css ด้วย
เปลี่ยนธีม
Adminer ใช้หน้าตาจาก public/adminer.css ตอน publish จะได้ธีม Hever มา อยากได้ธีมอื่นก็เลือกจากโฟลเดอร์ designs ของ Adminer แล้วเอาไฟล์ adminer.css ของธีมนั้นมาวางทับ รูปนี้คือธีม Dracula

เพิ่มปลั๊กอิน
Adminer มีปลั๊กอินให้เลือกอีกเยอะ วางไฟล์ปลั๊กอินไว้ใน resources/adminer/plugins (README บางตอนเขียนว่า resources/plugins ซึ่งไม่ถูก) แล้วใส่ชื่อ class ใน config ตัวอย่างนี้ใช้ปลั๊กอิน database-hide.php ซ่อนฐานข้อมูลของระบบออกจากรายการ
'plugins' => [
'AdminerDatabaseHide' => [['information_schema', 'performance_schema']],
'AdminerVersionNoverify',
],
array ของ AdminerDatabaseHide ต้องครอบสองชั้น เพราะแพ็กเกจกระจาย array ออกเป็น argument ของ constructor ทีละตัว ส่วน AdminerVersionNoverify ปิดการเช็กเวอร์ชันใหม่กับ adminer.org
ปลั๊กอินนี้แค่ซ่อนชื่อออกจากรายการ ตัวปลั๊กอินเองก็เขียนไว้ว่าไม่ได้ทำมาเพื่อความปลอดภัย ถ้าจะกันจริงต้องกันที่สิทธิ์ของ user ฐานข้อมูล
ข้อควรรู้
- Adminer เขียนได้ทุกอย่าง ทั้ง
UPDATE,DELETEและDROP TABLEไม่มีโหมดอ่านอย่างเดียว ถ้าใช้บน production ให้ระวังเหมือนเปิด MySQL client ตรง ๆ - Adminer ในแพ็กเกจตามหลังตัวจริง แพ็กเกจรวม Adminer 5.0.4 มา ส่วนตัวล่าสุดของ Adminerไปถึง 6.x แล้ว Adminer จะเช็กกับ adminer.org แล้วขึ้นเลขเวอร์ชันใหม่ไว้มุมซ้ายบนให้รู้
- README เขียนไว้ตั้งแต่ Laravel รุ่นเก่า ตัวอย่างใน composer.json ยังเป็น
^7.0และเรื่องเปลี่ยนชื่อฟังก์ชันเป็นadm_ใช้กับเวอร์ชันเก่าเท่านั้น เวอร์ชัน 8 ใช้ Adminer 5 ที่มี namespace ของตัวเองแล้ว จึงไม่ชนกับ helper ของ Laravel
ถ้าอยากได้แบบอ่านอย่างเดียว
laravel-adminer เหมาะเมื่อเราต้องการ Adminer ครบทุกความสามารถ และคนที่เข้าได้มีแค่เราหรือทีมเล็ก ๆ ที่ไว้ใจกัน ถ้าอยากเปิดให้คนอื่นในทีมดูข้อมูลได้โดยไม่ต้องกลัวเผลอแก้ ผมเขียน laravel-db-console ขึ้นมาแทน ใช้ login และ Gate ของแอปเหมือนกัน แต่ทุก connection เป็นแบบอ่านอย่างเดียวตั้งแต่แรก และคำสั่งแก้โครงสร้างตารางรันไม่ได้เลย
GitHub: onecentlin/laravel-adminer




