至此,我們已經幾乎完成了整個留言板的功能。又到了愉快的重構時間。
事實上,之前在短網址服務中我們重構的進度過快。
為了保障重構是沒有問題的,應該要在撰寫測試之後再進行重構。
在判斷重構的基準時,我們可以從單一函式的行為下去探討:
把 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
中,我們做了
這顯然是不太正常的
我們可以用 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 功能