延續上篇:如何在laravel實作縮網址系統-功能實作篇「框架與結構」
接下來我們將深入實作 Laravel 框架中的路由(Router)、控制器(Controller)、業務邏輯(Service)、儲存庫模式(Repository Pattern),以及模型(Model)的細節。這些部分將構成我們縮網址系統的核心功能。
在開始之前,本篇需要具備基礎Laravel 知識
我也盡可能在註解上多附註說明,但像是Repository Pattern,這樣的模式不會在本篇詳加說明,有興趣的朋友可以留言讓我知道喔。
在 routes/api.php 中,我們將定義縮網址系統的 API 路由。這些路由將對應到控制器中的方法。
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UrlController;
/**
* 路由用於縮短給定的網址。
*
* 這個路由接受一個 POST 請求,並返回一個縮短後的網址。
*
* @author James
* @version 1.0.0
* @since 2024-09-01
*/
Route::post('/shorten', [\App\Http\Controllers\UrlShortenerController::class, 'shorten']);
/**
* 根據短碼進行重定向的路由。
*
* 這個路由接受一個 GET 請求,並根據給定的短碼將用戶重定向到原始網址。
*
* @author James
* @version 1.0.0
* @since 2024-09-01
*/
Route::get('/{short_code}', [\App\Http\Controllers\UrlShortenerController::class, 'redirect']);
/**
* 查詢短碼資訊的路由。
*
* 這個路由接受一個 GET 請求,並返回與給定短碼相關的元數據或資訊。
*
* @author James
* @version 1.0.0
* @since 2024-09-01
*/
Route::get('/lookup/{short_code}', [\App\Http\Controllers\UrlShortenerController::class, 'lookup']);
這些路由對應三個主要功能:
控制器負責處理路由映射到的請求,並調用相應的業務邏輯。我們在 app/Http/Controllers/UrlShortenerController.php 中實作這些方法。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Services\UrlService;
class UrlShortenerController extends Controller
{
protected $urlService;
public function __construct(UrlService $urlService)
{
$this->urlService = $urlService;
}
public function shorten(Request $request)
{
$this->validate($request, [
'url' => 'required|url|max:2048',
]);
$shortUrl = $this->urlService->createShortUrl($request->url);
return response()->json(['short_url' => $shortUrl], 201);
}
public function redirect($short_code)
{
$url = $this->urlService->getOriginalUrl($short_code);
if (!$url) {
return response()->json(['error' => 'Not found'], 404);
}
return redirect($url);
}
public function lookup($short_code)
{
$url = $this->urlService->getOriginalUrl($short_code);
if (!$url) {
return response()->json(['error' => 'Not found'], 404);
}
return response()->json(['original_url' => $url], 200);
}
}