Laravel MVC 架構與 CRUD 操作說明

MVC 架構說明

MVC 架構(Model-View-Controller)是一種軟體設計模式,將應用程式分為三部分:

  • Model(模型):處理資料邏輯與資料庫互動。
  • View(視圖):負責顯示資料給使用者。
  • Controller(控制器):處理使用者輸入,並決定呼叫哪個模型或回傳哪個視圖。

此架構有助於分離關注點,提高程式碼可維護性與重用性。

建立檔案

php artisan make:model ModelName                 # 建立模型
php artisan make:controller ControllerName           # 建立控制器
php artisan make:controller ControllerName -r        # 建立控制器含預設 CRUD 方法
php artisan make:migration MigrationName            # 建立資料表結構檔案
php artisan migrate                            # 執行 migration

routes/web.php 設定路由:

use App\Http\Controllers\ControllerName;

Route::resource('ModelName', ControllerName::class);

Read 查詢資料

單筆查詢

public function show(ModelName $ID)
{
    return response($ID, Response::HTTP_OK);
}

多筆查詢

public function index()
{
    $result = ModelName::all();

    return response($result, Response::HTTP_OK);
}

Create 新增資料

use App\Models\ModelName;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

public function store(Request $request)
{
    $result = ModelName::create($request->all());
    $result = $result->refresh(); // 取得最新資料

    return response($result, Response::HTTP_CREATED);
}

Update 更新資料

public function update(Request $request, ModelName $ID)
{
    $ID->update($request->all());
    $ID = $ID->refresh();

    return response($ID, Response::HTTP_OK);
}

Delete 刪除資料

public function destroy(ModelName $ID)
{
    $ID->delete();

    return response(null, Response::HTTP_NO_CONTENT);
}

分頁查詢

$items = ModelName::paginate($perPage);

分頁屬性與方法

  • total():總項目數
  • count():當前頁項目數
  • perPage():每頁顯示數量
  • currentPage():目前頁碼
  • lastPage():最後一頁頁碼
  • nextPageUrl()previousPageUrl():分頁網址
  • toArray()toJson():轉換為陣列或 JSON

保留查詢條件

$posts->appends(request()->query());
$posts->appends(['param' => $value]);

Trait 重用程式碼

trait Logger {
    public function log($message) {
        echo "Logging: $message\n";
    }
}

class User {
    use Logger;

    public function register() {
        $this->log('User registered');
    }
}

Accessor 自訂屬性讀取

class Product extends Model
{
    public function getPriceAttribute($value)
    {
        return number_format($value * 1.1, 2); // 加稅後價格
    }
}

class User extends Model
{
    public function getReferralAttribute()
    {
        return 'Your referral code goes here';
    }
}

使用 Symfony Response 工具

use Symfony\Component\HttpFoundation\Response;

$response = new Response();
$response->setContent('Hello, World!');
$response->setStatusCode(Response::HTTP_OK);
$response->headers->set('Content-Type', 'text/plain');
$response->send();

類型判斷 instanceof

if ($object instanceof ClassName) {
    // true 表示 $object 是 ClassName 的實例
}