รีวิว Lumen เบื้องต้น

Lumen เป็น Framework ที่ไวอย่างน่าแปลกใจ ยิ่งเห็นยังใช้ Symfony แล้วยิ่งแปลกใจ ตอนนี้เลยคิดได้อย่างเดียว Laravel เป็น Full framework ที่ระบบมันใหญ่จริงๆ

พอเป็น Lumen ที่ย่อหลายๆ อย่างเขามา ไม่มีระบบ Route ระบบ Request แล้วโยกมาใส่ใน Foundation Application แล้วระบบเบาขึ้นจม รวมถึงตัดระบบ Facade ทิ้ง ซึ่งก็ดีเพราะไม่จำเป็นต้องใช้แล้ว เพราะตอนนี้ Lumen สามารถทำ Dependency Injection ในระดับ Method ได้แล้ว (เขียน unittest ระบบ controller สบายล่ะ)

สมัยก่อนตอน Laravel4 ออกใหม่ ผมว้าวกับ Facade เอามากๆ แต่พอผมยิ่งศึกษา Design pattern หลายๆ แบบแล้วกลับพบว่า Facade ทำให้โปรแกรมเมอร์นิสัยเสีย เล่นเอาว่าคนใช้ L4 หลายคนไล่ไม่เป็นด้วยซ้ำว่า Class แท้จริงหลัง Facade คืออะไร มันสะดวกไปครับ คุม Code quality ยากมาก

นอกเรื่องไป กลับมาต่อ Lumen นอกจากปิด Facade แล้ว Eloquent ก็ไม่เปิดแบบ default ด้วย ซึ่งผมว่าดีนะ เพราะ Eloquent ก็เป็นอีกตัวที่ตอนแรกผมว้าว แต่ตอนนี้ผมพบว่าการใช้ ORM “ย้ำว่า ORM นั้นหมายถึงทุกตัวที่บนโลกนี้มี”

ตอนนี้ ORM ยังขาดสิ่งที่เรียกว่า Data layer ซึ่งทำให้ระบบเรียกใช้ Storage เกินความจำเป็น ยกตัวอย่าง Table posts มีลูกเป็น Table comments แต่นอนว่า ORM เรียก posts has many comments ได้อย่างสบาย แต่หลังจากนั้น comments เรียก posts ตรงๆ ไม่ได้ เพราะ ORM ทำให้ data กลายเป็น Hierarchy เมื่อจะมีการเรียกใช้ในลักษณะย้อนกลับ ทางเลือกมีสองอย่าง หนึ่ง query ใหม่ หรือสองก็ต้องโยน data ทั้งก้อนนั้นแหละเข้าไป ซึ่งนั้นคือการโยน posts ทั้งก้อนเข้าไป ทำให้การคุม story ของ method หรือ class นั้นๆ มันผิดไปเลย เช่น คุณอยากได้ระบบกดไลค์ comments แต่คุณดันโยน posts เข้าไปพร้อม comment id เพียงเพราะเดี๋ยวคุณต้องทำการ touch post นั้นๆ ให้อันดับมันสูงขึ้น

….. ผมว่าผมนอกเรื่องอีกล่ะ เอาเป็นว่าเรื่องพวกนี้อาจแก้ไขได้ด้วย design pattern ที่ดีกว่านี้แต่ผมยังหาไม่เจอ ดังนั้นสำหรับ Lumen ที่ปิด Eloquent ไว้ผมมองว่าดี เพราะผมอาจไม่ใช้ หรือไม่ก็ PDO ดิบๆ แทน

นอกนั้น Lumen สำหรับคนที่ใช้ Laravel มา ผมบอกได้เลยว่าปรับตัวน้อยมาก Config บางตัวอาจหายไป แต่นอกนั้นถือว่าดี และทำงานได้ครบไม่แพ้ Laravel เลย

ส่วนข้อเสียที่อยากติคือ ตอนนี้คุณใช้ Lumen ได้ระบบ root path เท่านั้น ไม่สามารถใช้ใน subdirectory ได้ ซึ่งสำหรับคนที่จำเป็นจริงๆ ผมแนะนำ ให้ทำดังนี้ คือทำการ extend Laravel\Lumen\Application แล้วแก้ method getPathInfo() ในคลาสใหม่ให้เป็นรูปแบบนี้

    /**
     * Get the current HTTP path info.
     *
     * @return string
     */
    public function getPathInfo()
    {
        return preg_replace('#^'.dirname($_SERVER['SCRIPT_NAME']).'/?#', '/', parent::getPathInfo());
    }

แล้วทำการแก้ /bootstrap/app.php

$app = new Laravel\Lumen\Application;

ให้ไปใช้ class ใหม่ที่คุณสร้าง เท่านี้ก็จะทำงานได้เหมือนอย่างที่ Laravel เป็นแล้วครับ ส่วนใครคิดว่ามันเป็นบั๊ก แนะนำอ่าน https://github.com/laravel/lumen/pull/4 และ https://github.com/laravel/lumen-framework/pull/21 จะพบว่าเขาไม่คิดจะแก้ เพราะนี้คือความตั้งใจนะครับ

สรุป ณ ตอนนี้ Lumen น่าใช้ดีครับ ถ้าไม่นับว่า Phalcon2 พึ่งออก และคุณไม่ได้เช้า VPS เลยไม่สามารถติด Phalcon ได้ ผมแนะนำให้ใช้ Lumen ครับ

Leave a Reply