iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 6
2
Modern Web

使用 Laravel 打造 RESTful API系列 第 6

實作資料庫以及新建動物的方法

  • 分享至 

  • twitterImage
  •  

使用Laravel 8 PHP主流框架打造RESTful API(iT邦幫忙鐵人賽系列書)ISBN:9789864345304

本系列文章已集結成冊與鐵人賽文章差異內容,有以下幾點:

更新至Laravel 8、基礎的PHP重點筆記、加強製作API流程細節、加入程式設計模式,優化、重構程式碼的部分,並且於書籍前面的章節介紹Git。

讓您從製作第一個簡單的API到優化自己的程式碼,分享我的經驗給您,打造自己的最強大腦API,若有興趣的朋友可以參考看看

天瓏網路書局:
https://www.tenlong.com.tw/products/9789864345304


實作資料庫

昨天有規劃一下資料表欄位,所以今天就來實作它吧!還記得在產生 Model 的時候有新增了一個 Migration ,這個東西可能一開始不太知道是什麼,它是一個可以把建立資料表這件事交由程式碼的檔案,迅速的創建好需要的資料表。如果是多人共同開發的時候,可以方便拿到最新版的資料庫。

/animal/database/migrations/2019_08_22_201730_create_animals_table.php

檔案已經包含 updown 兩個方法,表示跑這個檔案的時候,會執行 up 寫好的內容,如果恢復資料庫時會跑 down 的方法 

class CreateAnimalsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('animals', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedInteger('type_id')->comment('動物分類');
            $table->string('name')->comment('動物的暱稱');
            $table->date('birthday')->nullable()->comment('生日');
            $table->string('area')->nullable()->comment('所在地區');
            $table->boolean('fix')->default(false)->comment('結紮情形');
            $table->text('description')->nullable()->comment('簡單敘述');
            $table->text('personality')->nullable()->comment('動物個性');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('animals');
    }
}

上面的程式欄位設定,可以參考官網的說明 https://laravel.com/docs/5.8/migrations#columns

程式寫完以後,讓我們來跑跑看是否成功,嘗試之前要把資料庫安裝好,還有設定好環境變數檔案。

打開根目錄的 .env

DB_CONNECTION=mysql   #你用的資料庫類別
DB_HOST=127.0.0.1     #資料庫裝在哪裡
DB_PORT=3306          #PORT號 mysql 預設 3306
DB_DATABASE=animal    #新建一個要來存放資料表的資料庫,把資料庫名稱填在這邊
DB_USERNAME=root      #可以操作這個資料庫的帳號
DB_PASSWORD=1234      #該帳號的密碼

好!以上設定完成以後!要在資料庫伺服器裡面新增 animal 資料庫名稱(這邊的animal 是資料庫名稱,migration 檔案運行後產生的是 animals 資料庫內的資料表),建立好後這個空空蕩蕩的資料庫,來看看下完指令後的變化吧!請執行下方指令~

C:\project\animal\ > php artisan migrate

跑出這樣的結果

運行結果

然後再去看看資料庫

運行前空蕩蕩

運行前

運行後

運行後

應該有多了一些資料表其中包含 animal

恭喜你成功了! 最基本的配置都已經完成了!要來正式開始寫操作功能

新建動物的方法

還記得昨天產生的三個檔案嗎?打開 AnimalController

裡面應該已經會有很多內容 不過不要害怕有我在

現在來打造新建一筆動物資料的動作,因為 Laravel 內建的 apiResource 已經配置相對應的方法,所以我省掉不少事情,我們找到 store 方法(再放一次路由的列表提供你參考)

路由表

Method URI Name Action Middleward
POST /api/animal anumal.store App\Http\Controllers\AnimalController@store api

請求動作是POST,請求網址 api/animal 他對應到的 AnimalController 裡面的 store 方法

AnimalController (Controller)

use App\Animal;
use Symfony\Component\HttpFoundation\Response;

public function store(Request $request)
{
    //Animal Model 有 create 寫好的方法,把請求的內容,用all方法轉為陣列,傳入 create 方法中。
    $animal = Animal::create($request->all());

    // 回傳 animal 產生出來的實體物件資料,第二個參數設定狀態碼,可以直接寫 201 表示創建成功的狀態螞或用下面 Response 功能 
    return response($animal, Response::HTTP_CREATED);
}

Animal (Model)

class Animal extends Model
{
    /**
     * 可以被批量賦值的屬性。
     *
     * @var array
     */
    protected $fillable = [
        'type_id',
        'name',
        'birthday',
        'area',
        'fix',
        'description',
        'personality',
    ];
}

為什麼要設定 $fillable? 因為像AnimalController 這樣的撰寫方式,把整個使用者請求的陣列直接用create 的方法寫入,會有安全性的問題,所以必須用 $fillable來限制哪些欄位可以被批量寫入。

假設今天是User被創建的動作,如果沒有這一層的保護,使用者的請求如果有包含權限的欄位值,就可以把User設定成管理員的權限。

嘗試可不可以運行

接下來開啟 Postman 程式

填一些基本資料

操作步驟

  1. 開啟一個頁籤
  2. 選擇 POST
  3. 輸入請求網址 127.0.0.1:8000/api/animal
  4. 選擇 Headers 頁籤
  5. 加入 key value 如圖顯示

接下來填寫請求的Body資料,如下圖。(欄位都要填喔!沒有填會有錯誤,我們目前只撰寫創建的程式碼,沒有檢查請求的欄位是否必填之類的程式。)

填寫Body

按下送出 Send 以後如果都正確會看到以下內容

輸出結果

可以看到右上角 Status:201 Created,並且有回傳該物件的內容!表示成功囉!恭喜!

來看看資料庫有沒有資料

資料庫內容

此篇文章同步發到個人部落格


上一篇
新建動物資源檔案
下一篇
刪除動物以及異常處理
系列文
使用 Laravel 打造 RESTful API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
jkes6203
iT邦新手 5 級 ‧ 2022-07-21 09:47:38

這邊補充一個途中遇到的小問題,在route的地方,不小心把animal打成animals
Route::apiResource('animals', AnimalController::class);
但是在直接改變把animals 改回animal後也是會報一樣的錯誤。
解決方法:
在cli輸入php artisan route:cache 就可以解決

https://ithelp.ithome.com.tw/upload/images/20220721/20128964hIx82rFXeD.png

我要留言

立即登入留言