PHP新手30天實戰金流
, Laravel
接下來三天內容是依照
Quentin Watt Tutorials 的影片 How to make an API with Laravel來實作。
今天我們所有步驟都會請 Artisan 來完成。Artisan 是 Laravel 框架本身提供的命令列工具,幫我們手動的作業自動化。
php artisan list
「模型」用來跟資料庫的資料表互動。
建立模型 "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?
除非明確地指定其他名稱,不然資料表名稱會是類別的小寫、底線、複數形式
異動 table欄位
php artisan make:migration add_email_to_people_table --table="people"
public function up()
{
Schema::table('people', function (Blueprint $table) {
$table->string('last_name');
$table->string('email')->unique();
$table->string('password');
});
}
寫好 migration file 後,查看一下目前 migrate狀態:php artisan migrate:status
執行資料表異動 php artisan migrate
至資料庫查看: SHOW COLUMNS FROM people;
執行 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,
填充假資料 php artisan db:seed
查看資料庫select * from people;
,確實新增 50筆 資料
在 routes/api.php
中
use App\Person;
Route::get('/person/{person}', function (Person $person) {
return $person;
});
如此,終端機執行 php artisan serve
後,即可 開啟 http://localhost:8000/api/person/2
為了讓專案架構更有系統,我們會讓 API 交由 controller來處理
routes/api.php
中,將剛剛的Route::get('/person/{person}',function (Person $person) { return $person; });
改成
Route::get('/person/{person}', 'PersonController@show');
php artisan make:controller PersonController
app/Http/Controllers/PersonController.php
PersonController.php
中public function show(Person $person)
{
return $person;
}
新增 PersonResourcephp artisan make:resource PersonResource
目錄下會增加: /app/Http/Resources/
資料夾,裡頭有 PersonResource.php
檔案
在 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);
}
在 app/Http/Resources/PersonResource.php
中 可以設定 data 要回傳的欄位
public function toArray($request)
{
return [
'last_name' => $this->last_name,
];
}
Collection 類別提供一個方便操作的資料封裝。Collection 不能更改,每一個 Collection 方法會回傳一個全新的 Collection 實例。
新增 PersonResourceCollectionphp artisan make:resource PersonResourceCollection --collection
目錄下會增加:/app/Http/Resources/PersonResourceCollection.php
在app/Http/Controllers/PersonController.php
:
use App\Http\Resources\PersonResourceCollection;
class PersonController extends Controller {}
中增加public function index(): PersonResourceCollection
{
return new PersonResourceCollection(Person::paginate());
}
routes/api.php
改成
Route::apiResource('/people', 'PersonController');
OK 今天先到這裡! 第三天會比較輕鬆,介紹 API(Store, Update, Delete)的實作方式~!
晚生學習分享所學經驗,若內容有誤或不清楚,煩請不吝指教!更是歡迎各位大神多多補充,感謝萬分!
person 會轉成 people 的原因是某個套件
vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php