iT邦幫忙

2026 iThome 鐵人賽

DAY 26
0
自我挑戰組

Laravel 讀碼源系列 第 26

美髮預約系統_users的程式碼-M跟C

  • 分享至 

  • xImage
  •  

https://laihao.vaserver.com/hairdressingusers

要來講解美髮預約系統_users的程式碼

就是MVC架構

/home/laihao/public_html/app/Models/Hairdressing/HairdressingUser.php

Models裡面的程式碼

<?php

namespace App\Models\Hairdressing;

use Illuminate\Database\Eloquent\Model;

class HairdressingUser extends Model
{
    protected $connection = 'mysql_hairdressing';
    protected $table = 'users';
    protected $primaryKey = 'id';
    public $timestamps = true;

    protected $fillable = [
        'name',
        'email',
        'password',
        'role',
        'status',
        'last_login_at',
    ];

    protected $hidden = [
        'password',
    ];

    public function staff()
    {
        return $this->hasOne(Staff::class, 'user_id');
    }
}

這段程式碼定義了一個 Laravel 的 Eloquent 模型 HairdressingUser,用來操作另一個 MySQL 資料庫中的 users 資料表,並設定該模型與 Staff 模型的一對一關聯。

程式碼逐段說明

1) 命名空間與引入類別

namespace App\Models\Hairdressing;

use Illuminate\Database\Eloquent\Model;
  • namespace App\Models\Hairdressing;:把這個模型放在 App\Models\Hairdressing 命名空間下,方便專案中分類管理(例如美髮相關的模型都放在這裡)。
  • use Illuminate\Database\Eloquent\Model;:引入 Laravel 的 Eloquent 模型基底類別,之後 HairdressingUser 繼承它就能使用 Eloquent 的功能(查詢、新增、更新等)。

2) 模型類別與基本設定

class HairdressingUser extends Model
{
    protected $connection = 'mysql_hairdressing';
    protected $table = 'users';
    protected $primaryKey = 'id';
    public $timestamps = true;
  • class HairdressingUser extends Model:定義一個 Eloquent 模型類別,代表「美髮系統的使用者」。
  • protected $connection = 'mysql_hairdressing';:指定這個模型要使用哪一個資料庫連線。這個名稱要在 config/database.phpconnections 裡有定義,通常是用來連到另一個獨立的 MySQL 資料庫(例如美髮系統的專屬 DB)。
  • protected $table = 'users';:指定對應的資料表名稱是 users。若沒指定,Eloquent 預設會用類別名稱的小寫複數(這裡會變成 hairdressing_users),所以這裡明確指定為 users
  • protected $primaryKey = 'id';:指定主鍵欄位名稱為 id(其實這也是預設值,但寫出來比較清楚)。
  • public $timestamps = true;:告訴 Eloquent 這個表有 created_atupdated_at 欄位,新增/更新時會自動維護這兩個時間戳。

3) 可大量賦值的欄位(fillable)

protected $fillable = [
    'name',
    'email',
    'password',
    'role',
    'status',
    'last_login_at',
];
  • $fillable 定義哪些欄位可以透過「大量賦值」的方式寫入,例如:
    HairdressingUser::create([
        'name' => 'Alice',
        'email' => 'alice@example.com',
        'password' => '...',
        'role' => 'admin',
        'status' => 'active',
    ]);
    
  • 沒放在 $fillable 裡的欄位,用 create()fill() 時會被忽略,這是 Laravel 防止「大量賦值漏洞」的機制。

4) 隱藏欄位(hidden)

protected $hidden = [
    'password',
];
  • $hidden 定義當模型轉成陣列或 JSON 時,哪些欄位要被隱藏。
  • 這裡把 password 設為隱藏,所以當你回傳 return $user;return response()->json($user); 時,密碼不會出現在結果中,避免洩漏敏感資訊。

5) 關聯:使用者 ↔ 員工

public function staff()
{
    return $this->hasOne(Staff::class, 'user_id');
}
  • 定義一個 Eloquent 關聯方法 staff(),表示「一個使用者對應一個員工資料」。
  • hasOne(Staff::class, 'user_id') 的意思是:
    • 關聯的模型是 Staff(完整類別名稱要看 use 或命名空間,通常會是 App\Models\Hairdressing\Staff 之類)。
    • 外鍵在 staff 資料表上,欄位名稱為 user_id,指向本模型的 id
  • 使用時可以這樣:
    $user = HairdressingUser::find(1);
    $staff = $user->staff; // 取得對應的 Staff 模型
    

整體用途總結

這個模型主要用來:

  • 連接到名為 mysql_hairdressing 的資料庫連線。
  • 操作該資料庫中的 users 資料表。
  • 提供安全的欄位控制(fillablehidden)。
  • 自動處理 created_at / updated_at
  • Staff 模型建立一對一關聯,讓你可以從使用者輕鬆取得對應的員工資料。

--
繼續MVC架構
/home/laihao/public_html/app/Http/Controllers/HairdressingUserController.php
在Controllers裡面的程式碼

<?php

namespace App\Http\Controllers;

use App\Models\Hairdressing\HairdressingUser;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class HairdressingUserController extends Controller
{
    public function index()
    {
        $hairdressingusers = HairdressingUser::orderBy('name')->get();

        return view('hairdressing.users.index', ['hairdressingusers' => $hairdressingusers]);
    }

    public function create()
    {
        return view('hairdressing.users.create');
    }

    public function store(Request $request)
    {
        $request->validate([
            'name'     => 'required|max:100',
            'email'    => 'required|email|max:150|unique:mysql_hairdressing.users,email',
            'password' => 'required|min:6',
            'role'     => 'required|in:admin,receptionist,stylist',
            'status'   => 'required|in:active,inactive',
        ]);

        HairdressingUser::create([
            'name'     => $request->name,
            'email'    => $request->email,
            'password' => Hash::make($request->password),
            'role'     => $request->role,
            'status'   => $request->status,
        ]);

        return redirect()->route('hairdressingusers.index')->with('success', '使用者新增成功!');
    }

    public function edit(HairdressingUser $hairdressinguser)
    {
        return view('hairdressing.users.edit', ['hairdressinguser' => $hairdressinguser]);
    }

    public function update(Request $request, HairdressingUser $hairdressinguser)
    {
        $request->validate([
            'name'     => 'required|max:100',
            'email'    => 'required|email|max:150|unique:mysql_hairdressing.users,email,' . $hairdressinguser->id,
            'password' => 'nullable|min:6',
            'role'     => 'required|in:admin,receptionist,stylist',
            'status'   => 'required|in:active,inactive',
        ]);

        $data = [
            'name'   => $request->name,
            'email'  => $request->email,
            'role'   => $request->role,
            'status' => $request->status,
        ];

        if ($request->filled('password')) {
            $data['password'] = Hash::make($request->password);
        }

        $hairdressinguser->update($data);

        return redirect()->route('hairdressingusers.index')->with('success', '使用者資料更新成功!');
    }

    public function destroy(HairdressingUser $hairdressinguser)
    {
        $hairdressinguser->delete();

        return redirect()->route('hairdressingusers.index')->with('success', '使用者已刪除!');
    }
}

這是一個典型的 Laravel CRUD 控制器,用來管理「美髮系統的使用者」(HairdressingUser),包含列表、新增、儲存、編輯、更新、刪除等功能,並對密碼做雜湊處理、對欄位做驗證。

整體結構

namespace App\Http\Controllers;

use App\Models\Hairdressing\HairdressingUser;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class HairdressingUserController extends Controller
  • 命名空間:App\Http\Controllers,表示這是控制器類別。
  • 引入:
    • HairdressingUser 模型:操作美髮系統的 users 資料表。
    • Request:取得表單與請求資料。
    • Hash:用來對密碼做雜湊(加密)。
  • 繼承 Controller:使用 Laravel 基礎控制器。

下面依方法說明。


1) index:列出所有使用者

public function index()
{
    $hairdressingusers = HairdressingUser::orderBy('name')->get();

    return view('hairdressing.users.index', ['hairdressingusers' => $hairdressingusers]);
}
  • HairdressingUser::orderBy('name')->get();
    • mysql_hairdressing.users 資料表取出所有使用者。
    • 依照 name 欄位排序(預設升冪)。
  • view('hairdressing.users.index', [...])
    • 回傳視圖 resources/views/hairdressing/users/index.blade.php
    • $hairdressingusers 傳進視圖,在畫面上列出使用者清單。

2) create:顯示新增使用者表單

public function create()
{
    return view('hairdressing.users.create');
}
  • 直接回傳新增表單的視圖:resources/views/hairdressing/users/create.blade.php
  • 這個視圖通常會有 <form>,action 指向 store 方法的路由。

3) store:儲存新使用者

public function store(Request $request)
{
    $request->validate([
        'name'     => 'required|max:100',
        'email'    => 'required|email|max:150|unique:mysql_hairdressing.users,email',
        'password' => 'required|min:6',
        'role'     => 'required|in:admin,receptionist,stylist',
        'status'   => 'required|in:active,inactive',
    ]);

    HairdressingUser::create([
        'name'     => $request->name,
        'email'    => $request->email,
        'password' => Hash::make($request->password),
        'role'     => $request->role,
        'status'   => $request->status,
    ]);

    return redirect()->route('hairdressingusers.index')->with('success', '使用者新增成功!');
}

驗證規則

  • name:必填,最多 100 字。
  • email
    • 必填、必須是合法 email、最多 150 字。
    • unique:mysql_hairdressing.users,email:在 mysql_hairdressing 連線的 users 表中,email 必須唯一。
  • password:必填,最少 6 字。
  • role
    • 必填。
    • in:admin,receptionist,stylist:只能是這三個值之一(管理員、接待、設計師)。
  • status
    • 必填。
    • in:active,inactive:只能是 activeinactive

寫入資料

  • HairdressingUser::create([...])
    • 使用模型的大量賦值建立新記錄。
    • 密碼用 Hash::make() 加密後才存入,避免明文密碼。
  • 成功後:
    • 重新導向到 hairdressingusers.index 路由(使用者列表)。
    • 帶入快閃訊息 success,在視圖中可顯示「使用者新增成功!」。

4) edit:顯示編輯使用者表單

public function edit(HairdressingUser $hairdressinguser)
{
    return view('hairdressing.users.edit', ['hairdressinguser' => $hairdressinguser]);
}
  • 利用 Laravel 的「路由模型綁定」:
    • 路由中通常會寫類似:Route::get('hairdressingusers/{hairdressinguser}/edit', ...)
    • Laravel 會自動根據 {hairdressinguser} 的 ID,從 HairdressingUser 模型查出對應記錄,注入到 $hairdressinguser 變數。
  • 回傳編輯視圖:resources/views/hairdressing/users/edit.blade.php,並帶入該使用者資料。

5) update:更新使用者資料

public function update(Request $request, HairdressingUser $hairdressinguser)
{
    $request->validate([
        'name'     => 'required|max:100',
        'email'    => 'required|email|max:150|unique:mysql_hairdressing.users,email,' . $hairdressinguser->id,
        'password' => 'nullable|min:6',
        'role'     => 'required|in:admin,receptionist,stylist',
        'status'   => 'required|in:active,inactive',
    ]);

    $data = [
        'name'   => $request->name,
        'email'  => $request->email,
        'role'   => $request->role,
        'status' => $request->status,
    ];

    if ($request->filled('password')) {
        $data['password'] = Hash::make($request->password);
    }

    $hairdressinguser->update($data);

    return redirect()->route('hairdressingusers.index')->with('success', '使用者資料更新成功!');
}

驗證規則差異

  • email 的 unique 規則:
    'unique:mysql_hairdressing.users,email,' . $hairdressinguser->id
    
    • 意思是:email 在 users 表中要唯一,但允許跟「目前這筆記錄」的 email 相同(排除自己的 ID),否則編輯時不改 email 也會驗證失敗。
  • password
    • nullable|min:6:可以不填;若有填,則最少 6 字。
    • 這樣編輯時若不想改密碼,就可以留空。

更新邏輯

  • 先準備 $data 陣列,包含基本欄位:name, email, role, status
  • 若使用者有填 password$request->filled('password') 為 true):
    • 才把密碼雜湊後加入 $data['password']
  • 呼叫 $hairdressinguser->update($data);
    • 更新這筆使用者記錄。
  • 成功後重新導向到列表頁,並帶入快閃訊息「使用者資料更新成功!」。

6) destroy:刪除使用者

public function destroy(HairdressingUser $hairdressinguser)
{
    $hairdressinguser->delete();

    return redirect()->route('hairdressingusers.index')->with('success', '使用者已刪除!');
}
  • 同樣使用路由模型綁定,取得要刪除的使用者。
  • 呼叫 $hairdressinguser->delete(); 從資料庫刪除該筆記錄。
  • 刪除後重新導向到列表頁,並顯示「使用者已刪除!」訊息。

補充:與模型的配合

  • 這個控制器依賴前面那個 HairdressingUser 模型:
    • 使用 $connection = 'mysql_hairdressing' 連到另一個資料庫。
    • 使用 $fillable 允許 name, email, password, role, status 大量賦值。
    • password 在模型中設為 $hidden,所以在視圖或 JSON 中不會直接露出明文密碼(而且這裡存的是雜湊值)。

明天來說明 畫面跟routes的部分


上一篇
美髮預約系統_users續集
下一篇
美髮預約系統_users的程式碼-顯示出資料內容的畫面
系列文
Laravel 讀碼源30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言