[Laravel] วิธีการใช้งาน Invokable Controller

Image placeholder
แวะมาทักทายกันได้

[Laravel] วิธีการใช้งาน Invokable Controller 


ในบทความนี้ เดี๋ยวเราจะมาคุยกันในเรื่องของการทำ Single Action Controller ใน Laravel 

รู้มั้ยว่า Single Controller คืออะไร และ ใช้เมื่อไร?

ใน Laravel Framework นั้นมี Service หนึ่งที่อำนวยความสะดวกในการ Single Action ที่เรียกว่า Invokable Controller มันได้เตรียม Method ที่เอาไว้ใช้สำหรับ API หรือ การเรียกข้อมูลเพียงอย่างใดอย่างหนึ่งเท่านั้นเอาไว้ให้


ฝากกดโฆษณา Google Ads สัก click  เพื่อเป็นกำลังใจแก่ผู้เขียนด้วยนะครับ


เราสามารถเรียก Controller นี้ได้ด้วยคำสั่ง Artisan ที่ Laravael Framework จัดเตรียมไว้ให้

php artisan make:controller TestController --invokable

หลังจากที่เราได้เรียกคำสั่งนี้แล้วจะเกิดไฟล์ Controller ขึ้นมาไฟล์หนึ่งจะมี หน้าตาตามนี้

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    public function __invoke()
    {
        //some codes goes here
    }
}


มาลองดูตัวอย่างที่จะนำ Invokable มาแก้ปัญหาสักหนึ่งตัวอย่าง


สมมติว่า เราต้องการที่จะไปยังหน้าเพจต่างๆตามที่เราระบุไว้ อย่างเช่น

localhost:8000/contact
localhost:8000/term
localhost:8000/about
Route::get('about', 'TestController@about');
Route::get('contact', 'TestController@contact');
Route::get('terms', 'TestController@terms');


หากว่าใครที่เขียน Laravel มาแล้วจะรู้ว่าเราจะต้องมาสร้าง method ใน TestController ให้ครบตามที่ระบุไว้หลัง @ ซึ่งก็จะทำให้มี method เยอะไปตามหน้าเพจเช่นเดียวกันและต้องเขียน code support ในเรื่องของ handle error อีกด้วยดังนั้น เราจะนำ Invokable มาช่วยแก้ปัญหาในเรื่องนี้


หลังจากที่เราได้ generate file controller invokable ขึ้นมาแล้วนั้น เราสามารถที่จะกำหนด ตัวแปรหรือ parameter ได้ใน { } block ในที่นี้มันจะรับค่า เช่น

Contact, term, about มาแทนที่ใน {} block นั้นเอง

Route::get('/{pages}','TestController')
       ->name('page');


จากนั้น เราสามารถที่จะระบุ parameter pages มาเป็นตัวแทนในการสร้างรับค่าจาก URL ได้และกำหนดชื่อ routing ด้วย method name โดยในที่นี้ระบุไว้ว่า 'page'

ตัวแปร Pages นั้นทำหน้าที่เสมือนเป็นชื่อ เพจโดยการรับค่าจาก Request Object ผ่านทาง method route ที่ไฟล์ blade


<a class="nav-link" href="{{ route('page','contact') }}">{{ __('Contact') }}</a>
 <a class="nav-link" href="{{ route('page','about') }}">{{ __('About') }}</a>
 <a class="nav-link" href="{{ route('page','terms') }}">{{ __('Terms') }}</a>


หลังจากที่ ระบุ route ที่ไฟล์ blade สามารถที่จะกำหนด รับค่าใน method invokable ได้ทันที

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    public function __invoke($page)
    {
      return view('pages' , $page);
    }
}


ใน Method View หรือ View Route จะทำหน้าที่ Route ไปยังหน้าอื่นๆ เสมือนการทำ Redirect สามารถที่จะเขียนทั้ง 2 แบบ แบบแรกจะไม่กำหนดชื่อ

Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);


สรุปได้ว่า ประโยชน์ของ Method Invokable ใน Controller สามารถที่จะกำหนด Single Action ได้ถ้าใน Controller นั้นๆมีหน้าที่เพียงหน้าที่เดียว โดยรวมหน้าที่ของ method อื่นๆมาอยู่รวมกัน จะทำให้ประหยัด Code ไปได้มากขึ้น


REF: 

https://www.codecheef.org/article/how-and-when-to-use-invokable-controllers-in-laravel

https://laravel.com/docs/7.x/routing#basic-routing

https://laravel.com/docs/7.x/controllers


แวะมาทักทายกันได้
donate

Categories: Tutorial Tags: #programing , #laravel , 2180