iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 2
2
Software Development

PHP新手30天實戰金流系列 第 2

[Day2] DB資料填充 + 初探 Laravel API

tags: PHP新手30天實戰金流, Laravel

前言

接下來三天內容是依照
Quentin Watt Tutorials 的影片 How to make an API with Laravel來實作。

今天我們所有步驟都會請 Artisan 來完成。Artisan 是 Laravel 框架本身提供的命令列工具,幫我們手動的作業自動化。

  • 看 artisan有那些指令可以用:
    php artisan list

首先使用 Laravel 的 Eloquent ORM 來建置資料庫。

1. 創建模型

「模型」用來跟資料庫的資料表互動。

  1. 建立模型 "Person" : php artisan make:model Person -mf ( -f : 建立該 Model 的 "factory", -m : 建立該 Model 的 "migration file" )
    目錄下會增加:

     app/Person.php
     database/factories/PersonFactory.php
     database/migrations/2019_09_13_040623_create_people_table.php
    

    咦?奇怪,為什麼建立 Person 模型, table 名稱卻是 people?

    除非明確地指定其他名稱,不然資料表名稱會是類別的小寫、底線、複數形式

  2. 異動 table欄位

    1. 自己寫一個異動 people table 的 migration
      php artisan make:migration add_email_to_people_table --table="people"
    2. 在新建的 migration file 中, 函式 up()和 down() 都有 Schema::table(),我們在 up() 的 table function 裡面加欄位:
    public function up()
    {
        Schema::table('people', function (Blueprint $table) {
    
            $table->string('last_name');
            $table->string('email')->unique();
            $table->string('password');
    
            });
        }
    
    • 若要刪除某欄位,就在down()裡的Schema::table()中用 dropColumn() 刪除該欄位,如下:
    1. 寫好 migration file 後,查看一下目前 migrate狀態:php artisan migrate:status

    2. 執行資料表異動 php artisan migrate

    3. 至資料庫查看: SHOW COLUMNS FROM people;

2. 填充假資料

  1. 執行 php artisan make:seed PersonTableSeeder
    會多出1個檔案

    database/seeds/PersonTableSeeder.php
    

    在 seeder 類別裡只會預設一個方法:run()。當執行 php artisan db:seed 時就會呼叫此方法。
    在 database/seeds/DatabaseSeeder.php 中,修改要呼叫的 Seeder:

    $this->call(PersonTableSeeder::class);
    

    若我們手動將每個模型的資料屬性都寫在Seeder裡,如下,會有點雜亂和麻煩。

    public function run()
        {
            DB::table('users')->insert([
                'last_name' => str_random(10),
                'email' => str_random(10).'@gmail.com',
                'password' => bcrypt('secret'),
            ]);
        }
    

    所以我們使用模型工廠 factory 來替代,
    在 PersonTableSeeder 的 run() 中使用 Person 的 factory :

    factory(App\Person::class, 50)->create();
    

    接著到 /database/factories/PersonFactory.php 的 return 陣列裡設定要填充的資料欄位:

    'last_name' => $faker->lastName,
    'email'     => $faker->safeEmail,
    'password'  => $faker->password,
    

  2. 填充假資料 php artisan db:seed
    查看資料庫select * from people;,確實新增 50筆 資料

Laravel API

牛刀小試簡易版

  • routes/api.php

    use App\Person;
    
    Route::get('/person/{person}', function (Person $person) {
        return $person;
    });
    

    如此,終端機執行 php artisan serve後,即可 開啟 http://localhost:8000/api/person/2

躍躍欲試 進階版-use Controller

  • 為了讓專案架構更有系統,我們會讓 API 交由 controller來處理

    1. routes/api.php中,將剛剛的
    Route::get('/person/{person}',function (Person $person) { return $person; });
    

    改成

    Route::get('/person/{person}', 'PersonController@show');
    
    1. 建立 PersonController
      php artisan make:controller PersonController
      目錄下會增加:
    app/Http/Controllers/PersonController.php
    
    1. 接著在 PersonController.php
    public function show(Person $person)
    {
        return $person;
    }
    
    1. 測試, http://localhost:8000/api/person/2

漸入佳境 進階版-use Resource

  1. 新增 PersonResource
    php artisan make:resource PersonResource
    目錄下會增加: /app/Http/Resources/資料夾,裡頭有PersonResource.php檔案

  2. app/Http/Controllers/PersonController.php 中引入 PersonResource 來使用, 並寫一個 show() 函式

    use App\Http\Resources\PersonResource;
    use App\Person;
    
    public function show(Person $person): PersonResource
    {
        return new PersonResource ($person);
    }
    
  3. app/Http/Resources/PersonResource.php中 可以設定 data 要回傳的欄位

public function toArray($request)
     {
    return [
                'last_name' => $this->last_name,
            ];
        }
  1. 測試, http://localhost:8000/api/person/30

更上層樓 進階版-use Collection

Collection 類別提供一個方便操作的資料封裝。Collection 不能更改,每一個 Collection 方法會回傳一個全新的 Collection 實例。

  1. 新增 PersonResourceCollection
    php artisan make:resource PersonResourceCollection --collection
    目錄下會增加:
    /app/Http/Resources/PersonResourceCollection.php

  2. app/Http/Controllers/PersonController.php:

    1. 增加
    use App\Http\Resources\PersonResourceCollection;
    
    1. 及在 class PersonController extends Controller {} 中增加
    public function index(): PersonResourceCollection
        {
            return new PersonResourceCollection(Person::paginate()); 
        }
    
  3. routes/api.php改成


Route::apiResource('/people', 'PersonController');
  1. 測試, http://localhost:8000/api/people?page=2

OK 今天先到這裡! 第三天會比較輕鬆,介紹 API(Store, Update, Delete)的實作方式~!
晚生學習分享所學經驗,若內容有誤或不清楚,煩請不吝指教!更是歡迎各位大神多多補充,感謝萬分!


上一篇
[Day 1] 認識LARAVEL
下一篇
[Day3] Laravel 6 API : Store & Update & Delete
系列文
PHP新手30天實戰金流34

1 則留言

1
jett
iT邦新手 5 級 ‧ 2019-09-19 16:14:20

person 會轉成 people 的原因是某個套件

vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php

我要留言

立即登入留言