2024-09-06|閱讀時間 ‧ 約 0 分鐘

如何在laravel實作縮網址系統-功能實作終章

延續上篇:如何在laravel實作縮網址系統-功能實作篇「框架與結構」


接下來我們將深入實作 Laravel 框架中的路由(Router)、控制器(Controller)、業務邏輯(Service)、儲存庫模式(Repository Pattern),以及模型(Model)的細節。這些部分將構成我們縮網址系統的核心功能。


在開始之前,本篇需要具備基礎Laravel 知識

我也盡可能在註解上多附註說明,但像是Repository Pattern,這樣的模式不會在本篇詳加說明,有興趣的朋友可以留言讓我知道喔。




1. Router(路由)

在 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']);

這些路由對應三個主要功能:

  • POST /api/shorten 用於生成短網址。
  • GET /api/{short_code} 用於根據短網址重定向到原網址。
  • GET /api/lookup/{short_code} 用於查詢短網址對應的長網址。

2. Controller(控制器)

控制器負責處理路由映射到的請求,並調用相應的業務邏輯。我們在 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);
}
}
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.