本系列文章已集結成冊與鐵人賽文章差異內容,有以下幾點:
更新至Laravel 8、基礎的PHP重點筆記、加強製作API流程細節、加入程式設計模式,優化、重構程式碼的部分,並且於書籍前面的章節介紹Git。
讓您從製作第一個簡單的API到優化自己的程式碼,分享我的經驗給您,打造自己的最強大腦API,若有興趣的朋友可以參考看看
昨天有規劃一下資料表欄位,所以今天就來實作它吧!還記得在產生 Model 的時候有新增了一個 Migration ,這個東西可能一開始不太知道是什麼,它是一個可以把建立資料表這件事交由程式碼的檔案,迅速的創建好需要的資料表。如果是多人共同開發的時候,可以方便拿到最新版的資料庫。
/animal/database/migrations/2019_08_22_201730_create_animals_table.php
檔案已經包含 up
、 down
兩個方法,表示跑這個檔案的時候,會執行 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 程式
填一些基本資料
接下來填寫請求的Body資料,如下圖。(欄位都要填喔!沒有填會有錯誤,我們目前只撰寫創建的程式碼,沒有檢查請求的欄位是否必填之類的程式。)
按下送出 Send 以後如果都正確會看到以下內容
可以看到右上角 Status:201 Created,並且有回傳該物件的內容!表示成功囉!恭喜!
來看看資料庫有沒有資料
此篇文章同步發到個人部落格
這邊補充一個途中遇到的小問題,在route的地方,不小心把animal打成animals
Route::apiResource('animals', AnimalController::class);
但是在直接改變把animals 改回animal後也是會報一樣的錯誤。
解決方法:
在cli輸入php artisan route:cache 就可以解決