iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
0
Modern Web

Laravel 8: For Beginners系列 第 13

留言板(Part3)

前言

至此,我們已經幾乎完成了整個留言板的功能。又到了愉快的重構時間。

附註

事實上,之前在短網址服務中我們重構的進度過快。

為了保障重構是沒有問題的,應該要在撰寫測試之後再進行重構。

重構

在判斷重構的基準時,我們可以從單一函式的行為下去探討:

  • 程式碼長度過長?
  • 在同一個函式做了很多件事?
  • 過於依賴註解去解釋程式碼應該解釋的事?

app/Http/Controllers/PostController.php 拿出來瀏覽一下

<?php

namespace App\Http\Controllers;

use App\Models\Message;
use Illuminate\Support\Str;
use Illuminate\Http\Request;

class PostController extends Controller
{
	public function __invoke(Request $request)
	{
		$request->validate([
			'title' => 'required|string',
			'content' => 'string|nullable',
			'attachment' => 'image|max:5120',
		]);

		if ($request->has('attachment')) {
			// 儲存圖片附件,並取得其路徑
			$attachment = $request->attachment->store('attachments');
		}

		Message::create([
			'name' => Str::random(8),
			'title' => $request->title,
			'content' => $request->content ?? '無內文',
			'attachment' => $attachment ?? null,
		]);

		return redirect()->route('view');
	}
}
  • 在一個 __invoke 中,我們做了
    • 驗證 Request
    • 儲存圖片
    • 建立留言,存進資料庫
    • 將用戶導向回主頁面

這顯然是不太正常的

重構 Request Validation

我們可以用 php artisan make:request PostRequest 去建立一個單純的 Request 檔案,並在裡面限制它的 Validation Rules。

<?php

// app/Http/Requests/PostRequest.php

class PostRequest extends FormRequest
{
	public function authorize()
	{
		return true;
	}

	public function rules()
	{
		return [
			'title' => 'required|string',
			'content' => 'string|nullable',
			'attachment' => 'image|max:5120', // 5MB
		];
	}
}

重構儲存圖片邏輯

<?php

// app/Http/Controllers/PostController.php

public function __invoke(PostRequest $request)
{
	Message::create([
		'name' => Str::random(8),
		'title' => $request->title,
		'content' => $request->content,
		'attachment' => $this->storeAttachment($request),
	]);

	return redirect()->route('view');
}

protected function storeAttachment(PostRequest $request): ?string
{
	if ($request->has('attachment') {
		return $request->attachment->store('attachments');
	}

	return null;
}

如果有需求的話,還可以再把 Message Model create 的邏輯再抽一層出來。

總結

在這個留言板服務中,我們體驗了比較深的 Laravel 功能

  • 用 Docker 建立環境(PostgreSQL)
  • 檔案上傳
  • Filesystem 機制

你還可以做的事

  • 優化視圖 UI/UX
  • 圖片超過 250x250 時,縮圖功能
  • 可以回覆別人的留言
  • 補上更多的測試
    • 分頁邏輯上的測試
    • 極端值的測試(例如用 5121KB 的圖片)

上一篇
留言板(Part2)
下一篇
一週回顧
系列文
Laravel 8: For Beginners14

尚未有邦友留言

立即登入留言