這篇用來記錄一下可能會踩到的坑,以及發現到的知識點。
---
# 前置作業
Lamp 環境可以參考[這篇教學](https://hackmd.io/@monkenWu/SyxEisueB),下方列出環境設定的不同處
* 沒有安裝 phpMyAdmin,改用其他 DBMS
* PHP 選用 `8.2` 版
* Composer 使用[官方指令](https://getcomposer.org/download/)
### Lamp
* [Linux](https://distrowatch.com)
* [Apache](https://httpd.apache.org)
* [MySQL](https://www.mysql.com/)、[MariaDB](https://mariadb.org/)
* [PHP](https://www.php.net)、[Python](https://www.python.org)
Windows 底下除了建置 wamp 以外,亦可以使用 [Xampp](https://www.apachefriends.org/zh_tw/index.html)
在使用 [Laravel](https://laravel.com) 前,得先安裝 [Composer](https://getcomposer.org) (PHP 的套件管理工具)
```bash!
sudo apt update
sudo apt upgrade -y
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```
安裝完成後,將 `phar` 檔移至 `PATH`
```bash
sudo mv composer.phar /usr/local/bin/composer
```
透過官方提供的指令,建立新的專案
```bash
composer create-project laravel/laravel:^10.0 example-app
cd example-app
```
# CRUD 實作
( Create, Read, Update, Delete )
## MVC 模型圖

截自 [Laravel CRUD in 50 minutes for Beginners from Scratch](https://youtu.be/_LA9QsgJ0bw?si=dilA1Vdf2_ElbSLT)
我覺得這部很易懂,實作筆記基本從這來的,推薦跟著跑一遍流程
:::info
### 建立新專案
```bash!
composer create-projdect laravel/laravel --prefer-dist <project_name> "<laravel_verison>"
```
建立完後,cd 到專案目錄開啟 VSCode
---
### Run Server
Laravel 內建 Server 啟動工具,URL 預設會掛在 127.0.0.1:8000 下
```bash
php artisan serve
```
MariaDB 在 WSL 的啟動指令
```bash
sudo service mysql start
sudo service mysql stop
sudo service mysql restart
```
---
### Database
* Laravel 設定檔 (.env)
`DB_DATABASE` 改成你的專案名稱
`DB_PASSWORD` 沒設定密碼就留空
<br>
* 建立資料表 & 整合資料庫
```bash
php artisan make:migrate <table_name>
php artisan migrate
```
<br>
整體用法類似 git,將要新增/修改內容的操作,透過 Laravel migrate 工具來管理。
創好資料表後可以設定類似以下的內容 ( /database/migrations/<table_name> )
```php!
public function up(): void
{
Schema::create('<table_name>', funciton (Blueprint $table) {
$table->id();
$table->string('user_name');
$table->interger('total_cost');
$table->decimal('each_price');
$table->text('description');
$table->timestamps();
});
}
```
資料庫可以使用 phpMyAdmin 來管理資料
不過我選擇 VSCode 的 [Database Client](https://database-client.com) 套件來操作
:::
---
# 頁面顯示
### Controller
```php!
public funciton index(){
$model_items = ModelName::all();
return view('<path>.<blade_name>', ['model_items', $model_items])
/* eg. dir/index.blade.php => dir.index */
}
```
### Routes
```php!
/*
陣列第二元素 = Controller 裡的 Function 名稱
name 則是 Path + Function Name => Route Name
*/
Route::get('/<path>', [ControllerName::class, 'index'])->name('<path>.index');
```
### Blade
透過 Controller 轉發,將資料帶過來後,可在表單中帶入資料
```php!
@foreach($model_items as $item)
<tr>
<td>{{$item->id}}</td>
<td>{{$item->name}}</td>
<td>{{$item->price}}</td>
</tr>
@endforeach
```
## 新增
在 B 頁面表單中,將資料以 post 發給 Route,之後從 B 頁面帶回 A 頁面
### Controller
```php!
public function create(Request $request){
// 若要攔截顯示 BUG 可用 validateWithBag
$validated = $request->validate([
'name' => 'required',
'price' => 'required|decimal:0,2'
]);
$newItem = ModelName::create($validated);
return redirect(route('<Route_Name>'));
}
```
### Routes
```php!
Route::post('/<path>', [ControllerName::class, 'create'])->name('<path>.create');
```
### Blade
```php!
<form method="post" action="{{route('<Route_Name>')}}">
@csrf
@method('post')
<div>
<label>Name</label>
<input type="text" name="name" placeholder="Name"/>
</div>
<div>
<label>Price</label>
<input type="text" name="price" placeholder="Price"/>
</div>
<div>
<input type="submit" value="Create a new item">
</div>
</form>
```
## 編輯
分成兩部份,先取得資料後發送更新請求。
### Controller
```php!
public function edit(ModelName $model){
return view('<path>.edit', ['item' => $model]);
}
public function update(Request $request, ModelName $model){
$data = $request->validate([
'name' => 'required',
'price' => 'required|decimal:0,2'
]);
$model->update($data);
return redirect(route('<Route_Name>'));
}
```
### Routes
```php!
Route::get('/<path>', [ContronllerName::class, 'edit'])->name('<path>.edit');
Route::put('/<path>', [ContronllerName::class, 'update'])->name('<path>.update');
```
### Blade
路由轉發用的編輯按鈕
```php!
@foreach($model_items as $item)
<tr>
<td>{{$item->id}}</td>
<td>{{$item->name}}</td>
<td>{{$item->price}}</td>
<td>
<form method="post" action="{{route('<path>.edit', ['model' => $item])}}">
@csrf
@method('get')
<input type="submit" value="Edit">
</form>
</td>
</tr>
@endforeach
```
編輯頁面
```php!
<form method="post" action="{{route('<path>.update', ['model' => $item])}}">
@csrf
@method('put')
<div>
<label>Name</label>
<input type="text" name="name" value="{{$item->name}}"/>
</div>
<div>
<label>Price</label>
<input type="text" name="price" value="{{$item->price}}"/>
</div>
<div>
<input type="submit" value="Update">
</div>
</form>
```
## 刪除
### Controller
```php!
public function delData(ModelName $model){
$model->delete();
return redirect(route('<path>.index'));
}
```
### Routes
```php!
Route::delete('/<path>', [ControllerName::class, 'delData'])->name('<path>.del');
```
### Blade
路由轉發用的刪除按鈕
```php!
@foreach($model_items as $item)
<tr>
<td>{{$item->id}}</td>
<td>{{$item->name}}</td>
<td>{{$item->price}}</td>
<td>
<form method="post" action="{{route('<path>.del', ['model' => $item])}}">
@csrf
@method('delete')
<input type="submit" value="Delete">
</form>
</td>
</tr>
@endforeach
```
---
# 更多指令
在專案越來越龐大之後會需要更細的分工,如:Repository、Service ...等
然而原生 Laravel 工具集中沒有包含自動生成這些檔案的指令,因此需要安裝第三方工具集
本文選用:[Laravel More Command](https://github.com/theanik/laravel-more-command)
能夠生成 Repository、Repository with Interface、Service、Trait、View(blade file)、Clear Log,且使用指令的格式與原生 `php artisan` 一樣
### 安裝
```bash
composer require theanik/laravel-more-command --dev
```
或是在 composer.json 中的 `require-dev` 加入下方內容,並執行 `composer update`
```json
"require-dev": {
"theanik/laravel-more-command": "^1.3.0"
}
```
### Make Repository
會自動在 **APP** 下建立 **Repositories** 資料夾
__生成 Repository:__
```bash
php artisan make:repository UserRepository
```
or
```bash
php artisan make:repository Backend/UserRepository
```
__生成 Repository with Interface:__
```bash
php artisan make:repository UserRepository -i
```
or
```bash
php artisan make:repository Backend/UserRepository -i
```
### Make Service
會自動在 **APP** 下建立 **Services** 資料夾
__生成 Service:__
```bash
php artisan make:service UserService
```
or
```bash
php artisan make:service Backend/UserService
```
### Make View
會自動在 **APP** 下建立 **Blade** 資料夾
__生成 View:__
```bash
php artisan make:view index
```
or
```bash
php artisan make:view user/index
```
### Make Trait
會自動在 **APP** 下建立 **Traits** 資料夾
__生成 Trait:__
```bash
php artisan make:trait HasAuth
```
or
```bash
php artisan make:trait Backend/HasAuth
```
## Log Clear
```bash
php artisan log:clear
```
> ※ 該指令會刪除 ***所有*** 在 `/storage/logs/` 下的資料!