# 利用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)