# 利用Laravel製作API ## :memo:事前作業 請先自行安裝以下軟體: 1.[Postman](https://www.postman.com/downloads/) 請先參閱: 1.[建立Laravel框架環境](https://hackmd.io/GTD7jSI9TDuT4DUBFseMKw) 2.[使用Laravel進行PHP的資料庫連線](https://hackmd.io/gr6O3d_HTRSgNlaEjKShVg) 請先了解: 1.本教學是利用建立物件,對物件進行資料庫操作的方式,與上一篇不同。上一篇是利用laravel中database的函式庫進行操作。 ## Step.1 建立controller 在laravel專案底下開啟命令提示字元,輸入以下指令: ``` php artisan make:controller api/PostController --api ``` 執行完後,會在app/Http/Controllers底下建立一個叫api的資料夾,裡面產生一個叫PostController,.php的文件。後面的"- -api"會幫我們省略"create"和"edit"的方法。 ![](https://i.imgur.com/T4NSZOc.png) ## Step.2 設定Route >routes/api.php 在最底下輸入下列程式碼: ```php Route::get('/test','App\Http\Controllers\api\TestController@index'); ``` 該行程式碼的意思是,建立一個get方法的route,當網址連上"/test"的時候,會連接到"App\Http\Controllers\api\TestController"這個檔案的index()方法。 Route設定完後,可以在命令提示字元中輸入以下指令,就可以看到目前註冊完的route有哪一些。 ``` php artisan route:list ``` ![](https://i.imgur.com/F5kszaX.png) :::warning 這邊要注意,在route之前被強制加上了"api/"的前綴,所以在連網址的時候需要加上api/route_name。如果要修改掉請另外找方法。 ::: ## Step.3 建立Model 在命令提示字元中輸入以下指令: ``` php artisan make:model model_name ``` 該指令會在app/Models資料夾裡面新增一個php文件。 ![](https://i.imgur.com/od5ODk3.png) >app/Models/Test 打開後,將內容改成下列程式碼: ![](https://i.imgur.com/V9z6GL3.png) 其中,table指的是資料表名稱;primaryKey指的是主鍵;fillable指的是可以修改的欄位有哪一些,如果沒有設定則不能對資料表進行刪除、修改。 ## Step.4 設定方法 >App\Http\Controllers\api\TestController.php 在class上方新增以下程式: ```php use App\Models\Test; ``` 修改index()的方法,裡面就是讀取資料庫的sql語句,並回傳資料。 ```php public function index() { $test = Test::get()->toJson(JSON_PRETTY_PRINT); return response($test, 200); } ``` 所以全部的程式大概會是長這樣: ![](https://i.imgur.com/5Y3ODZr.png) ## Step.5 查看API是否成功可用 我們打開一開始安裝的Postman,將HTTP method改成get,網址列打上IP加上route,按下send,在底下就能看到回傳過來的值了喔! ![](https://i.imgur.com/QJqsDTI.png) 從網頁上打上route也可以看的到哦! ![](https://i.imgur.com/jVIW83k.png) ## Step.6 新增其他方法 ### 條件查詢 > App\Http\Controllers\api\TestController.php 在下方的show()新增以下程式碼: ```php if (Test::where('id', $id)->exists()) {//如果資料表存在id=$id這筆資料的話 $test = Test::where('id', $id)->get()->toJson(JSON_PRETTY_PRINT); return response($test, 200);//第二個參數是status Code } else { return response()->json([ "message" => "Student not found"], 404); } ``` >routes/api.php 在下方新增新的route: ```php Route::get('test/{id}','App\Http\Controllers\api\TestController@show'); ``` 打開網頁後,在網址後面輸入參數,就可以傳遞ID並進行查詢了哦! ![](https://i.imgur.com/uWP7HKW.png) :::warning 這邊使用網址輸入參數時,不用像原本的PHP是要輸入參數名稱,這邊直接輸入數值就可以了。 ::: ### 新增 > App\Http\Controllers\api\TestController.php 在下方的store()新增以下程式碼: ```php $Test = new Test; $Test->name = $request->name; $Test->age = $request->age; $Test->save(); return response()->json([ "message" => "Test record created"], 201); ``` >routes/api.php 在下方新增新的route: ```php Route::post('test/add/','App\Http\Controllers\api\TestController@store'); ``` ![](https://i.imgur.com/fnId8TE.png) ### 更新 > App\Http\Controllers\api\TestController.php 在update()裡面新增以下程式碼: ```php if (Test::where('id', $id)->exists()) { $test = Test::find($id); $test->name = is_null($request->name) ? $test->name : $request->name; $test->age = is_null($request->age) ? $test->age : $request->age; $test->save(); return response()->json([ "message" => "records updated successfully"], 200); } else { return response()->json([ "message" => "Student not found"], 404); } ``` >routes/api.php 在最下方新增下列程式碼: ```php Route::put('test/{id}','App\Http\Controllers\api\TestController@update'); ``` 接下來在Postman裡面,我們需要把請求改成"PUT",接著傳送的資料選擇Body->raw->JSON,以JSON的格式輸入要更新的資料。 ![](https://i.imgur.com/J4Ub32b.png) 更新成功!接下來來看看是否真的更新資料了,將方法改成get,route就會回到show()這個方法囉! ![](https://i.imgur.com/nSwBRp5.png) ### 刪除 > App\Http\Controllers\api\TestController.php 在destroy()裡面新增以下程式碼: ```php if(Test::where('id', $id)->exists()) { $test = Test::find($id); $test->delete(); return response()->json([ "message" => "records deleted"], 202); } else { return response()->json([ "message" => "Student not found"], 404); } ``` >routes/api.php 在最下方新增下列程式碼 ```php Route::delete('test/{id}','App\Http\Controllers\api\TestController@destroy'); ``` 接著到Postman執行看看吧!HTTP method記得改成DELETE。 ![](https://i.imgur.com/ihN7aBr.png) 顯示成功刪除訊息! 接下來再查看所有資料,看是不是ID=3的這筆資料被刪除了。 ![](https://i.imgur.com/9UrMKEP.png) 成功刪除了! ## 程式碼 > App\Http\Controllers\api\TestController.php ```php=1 <?php namespace App\Http\Controllers\api; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\Test; class TestController extends Controller { public function index() { $test = Test::get()->toJson(JSON_PRETTY_PRINT); return response($test, 200); } public function store(Request $request) { // } public function show($id) { if (Test::where('ID', $id)->exists()) { $test = Test::where('ID', $id)->get()->toJson(JSON_PRETTY_PRINT); return response($test, 200); } else { return response()->json([ "message" => "Student not found"], 404); } } public function update(Request $request, $id) { if (Test::where('id', $id)->exists()) { $test = Test::find($id); $test->name = is_null($request->name) ? $test->name : $request->name; $test->age = is_null($request->age) ? $test->age : $request->age; $test->save(); return response()->json([ "message" => "records updated successfully"], 200); } else { return response()->json([ "message" => "Student not found"], 404); } } public function destroy($id) { if(Test::where('id', $id)->exists()) { $test = Test::find($id); $test->delete(); return response()->json([ "message" => "records deleted"], 202); } else { return response()->json([ "message" => "Student not found"], 404); } } } ``` > routes/api.php ```php=1 <?php use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | API Routes |-------------------------------------------------------------------------- | | Here is where you can register API routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | is assigned the "api" middleware group. Enjoy building your API! | */ Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); }); Route::get('test','App\Http\Controllers\api\TestController@index'); Route::get('test/{id}','App\Http\Controllers\api\TestController@show'); Route::put('test/{id}','App\Http\Controllers\api\TestController@update'); Route::delete('test/{id}','App\Http\Controllers\api\TestController@destroy'); ``` > app/Models/Test.php ```php=1 <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Test extends Model { use HasFactory; protected $table = 'test'; // 資料表名稱 protected $primaryKey = 'ID'; // 主鍵 public $timestamps = false; protected $fillable = ['ID','name','age']; } ``` ## 參考資料 1.[Building and Consuming a RESTful API in Laravel PHP - Twilio](https://www.twilio.com/blog/building-and-consuming-a-restful-api-in-laravel-php) 2.[Eloquent ORM - Laravel - 為網頁藝術家創造的 PHP 框架](https://laravel.tw/docs/5.0/eloquent)