
หลังจากที่ติดตั้ง lumen ไปแล้ว ต่อไปเราก็จะสร้าง REST API ใครยังไม่ติดตั้ง ไปทางนี้เลยครับ ติดตั้ง Lumen สำหรับสร้าง REST API
ส่วนใครพร้อมแล้วมาเริ่มเลยครับ
1.ออกแบบ REST API
REST API ที่จะทำสำหรับ Thai Crane Company แอพรวมข้อมูลบริษัทเครนในประเทศไทย มี prototype ตามนี้ครับ

จาก prototype ออกแบบ api ก็จะได้ ดังนี้ครับ
GET /v1/company ดึงข้อมูลบริษัทเครนทั้งหมด แสดงผลในหน้าแรก
GET /v1/company/{id} ดึงข้อมูลบริษัทเครนตามที่เลือก กดปุ่ม detail
GET /v1/company/geo/{id} ดึงข้อมูลบริษัทเครนตามภาค กดเลือก เมนูที่ side menu
2.สร้าง CompanyController
ต่อไปก็สร้าง Controller เอาไว้ใช้งานตาม api ที่ออกแบบไว้ ไปยัง lumen project แล้วสั่ง
php artisan make:controller CompanyController
ปรากฏว่า error ครับ เพราะ lumen ไม่มีคำสั่ง make:controller ให้ใช้งาน
เมื่อใช้ไม่ได้ เราก็ต้องหาผู้ช่วยครับ ติดตั้ง lumen-generators เข้าไปเพิ่มใน project ครับ
composer require wn/lumen-generators
ลงทะเบียน Service Provider ในไฟล์ bootstrap/app.php
$app->register(‘Wn\Generators\CommandsServiceProvider’);
เอา comment หน้า code $app->withEloquent(); ออก เป็นการใช้งาน Eloquent ORM
$app->withEloquent();
สั่ง php artisan list จะเห็นรายการเพิ่มขึ้นมาดังนี้
สร้าง Company Controller
php artisan wn:controller Company
จะได้ไฟล์ CompaniesController.php เพิ่มเข้ามา และเพิ่มข้อมูล route ในไฟล์ routes/web.php
สังเกตว่า ใน CompaniesController มีการเรียกใช้งาน RESTActions เราสามารถเรียกใช้ RESTActions ใน Controller ตัวอื่นๆ ได้
เพิ่ม RESTActions ดังนี้ครับ
php artisan wn:controller:rest-actions
RESTActions สร้างเป็น trait ( เริ่มใช้ตั้งแต่ PHP 5.4.0 ทำให้ PHP สามารถ implements a method เพื่อ reuse code ได้ )
3.สร้าง Model Company
ก่อนสร้าง model ก็ต้องสร้าง database พร้อมกับนำข้อมูลให้เรียบร้อยครับ
ไฟล์ sql ครับ https://github.com/bchaichon/thai_crane_company/blob/master/db_crane.sql
(ตาราง migrations จะไม่มีใน sql นะครับ ถูกสร้างตอน run คำสั่ง migration ครับ )
ต่อไปก็กำหนดค่า config ของ database โดยการ copy file .env.example save as เป็น .env แล้วแก้ไขข้อมูลตาม database ที่จะใช้งานครับ ของผมแก้ได้ดั้งนี้ อย่าลืมใส่ timezone เป็น Asia/Bangkok นะครับ
และแล้วก็ได้เวลา สร้าง Company model
php artisan wn:model Company
เสร็จแล้ว run server php -S localhost:8000 -t public เข้าเว็บไปที่ http://localhost:8000/company
จะพบว่า หาตาราง crane.companies ไม่เจอครับ เพราะมันไม่มีนั่นเอง
เพิ่มข้อมูลไปใน Model Company ดังนี้
1 2 3 |
protected $table = 'company'; //ระบุตาราง protected $primaryKey = 'company_id'; //ระบุ primary key ถ้าไม่ระบุจะใช้เป็น id protected $hidden = ['create_at', 'update_at']; // ฟิลด์ไหนที่ไม่ต้องการแสดง |
เข้าใหม่ที่ http://localhost:8000/company รอบนี้ก็จะได้ข้อมูล บ.เครน ออกมาครับ
จากข้อที่ 1 เราออกแบบ REST API ให้มีเลข version ด้วย /v1/company ปรับไฟล์ routes/web.php โดยเพิ่ม group prefix เข้าไป แล้วย้าย route ที่เกี่ยวกับ company เข้าไปไว้ข้างใน ก็จะได้ไฟล์หน้าตาแบบนี้ครับ
ส่วน post put delete ไม่ได้ใช้ ก็ comment ไว้ครับ เนื่องจากแอพ Thai Crane Company ดึงข้อมูลมาแสดงอ่านเดียว
เราก็จะสามารถเรียกใช้งานได้แล้วครับ
http://localhost:8000/v1/company ดึงข้อมูลทั้งหมด
http://localhost:8000/v1/company/2 ดึงข้อมูล บ.เครน id=2
เหลืออีก 1 ตัวครับ คือ แสดงข้อมูล บ.เครน ตามภาค /v1/company/geo/{id}
เพิ่ม function geo เข้าไป CompaniesController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Http\Response; class CompaniesController extends Controller { const MODEL = "App\Company"; use RESTActions; function geo($id){ $m = self::MODEL; $model = $m::join('province','company.province_id','=','province.province_id') ->join('geography','province.geography_id','=', 'geography.geography_id') ->where('geography.geography_id' , '=', $id) ->get(); if(is_null($model)){ return $this->respond(Response::HTTP_NOT_FOUND); } return $this->respond(Response::HTTP_OK, $model); } } |
เพิ่ม $app->get(‘company/geo/{id}’, ‘CompaniesController@geo’); ลงไปในไฟล์ routes/web.php
เข้าเว็บเรียกใช้งานดูครับ http://localhost:8000/v1/company/geo/2 ก็จะได้ข้อมูลของภาคกลางออกมา
จบแล้วครับ API พร้อมใช้งาน ต่อไปก็จะเป็นการทำแอพ android ครับ
หวังว่าจะมีประโยชน์นะครับ ^^
Ref Link.
https://github.com/webNeat/lumen-generators
https://laravel.com/docs/5.0/queries