當前位置: 首頁> 最新文章列表> 在Laravel 中封裝date_sunset() 服務提供城市日落查詢

在Laravel 中封裝date_sunset() 服務提供城市日落查詢

M66 2025-05-31

在Web 開發中,處理與時間、日期相關的功能是非常常見的需求。如果你想要在Laravel 中實現一個按城市查詢日落時間的服務,可以通過封裝date_sunset()函數來實現。 Laravel 提供了強大的擴展性,使得將這類功能模塊化變得非常簡單。在這篇文章中,我們將一步一步地講解如何實現這個功能。

1. date_sunset()函數簡介

date_sunset()是PHP 內置的一個函數,它可以根據給定的經緯度、日期等參數,返回該地點的日落時間。其基本用法如下:

 date_sunset(time(), SUNFUNCS_RET_STRING, $latitude, $longitude, 0, 0);

其中, $latitude$longitude為城市的緯度和經度。 date_sunset()會根據這些信息返回對應的日落時間。

2. 封裝date_sunset()函數

在Laravel 中,我們可以通過創建一個服務類來封裝date_sunset()函數,從而簡化操作,增強代碼的可重用性和可維護性。

2.1 創建服務類

首先,在Laravel 中,我們需要創建一個服務類來封裝這個功能。可以通過Artisan 命令生成該服務類:

 php artisan make:service SunsetService

然後,我們在app/Services/SunsetService.php文件中實現封裝邏輯:

 namespace App\Services;

class SunsetService
{
    /**
     * 獲取城市的日落時間
     *
     * @param string $cityName 城市名稱
     * @return string
     */
    public function getSunsetTimeByCity(string $cityName): string
    {
        // 通過城市名獲取城市的經緯度信息
        $coordinates = $this->getCoordinatesByCity($cityName);

        if (!$coordinates) {
            return '無法獲取城市信息';
        }

        // 獲取日落時間
        return date_sunset(time(), SUNFUNCS_RET_STRING, $coordinates['latitude'], $coordinates['longitude'], 0, 0);
    }

    /**
     * 根据城市名稱获取城市的经纬度
     *
     * @param string $cityName 城市名稱
     * @return array|null
     */
    private function getCoordinatesByCity(string $cityName)
    {
        // 調用外部 API 獲取城市經緯度數據
        $url = "https://api.openweathermap.org/data/2.5/weather?q={$cityName}&appid=your_api_key";
        
        // 獲取城市的經緯度數據
        $response = file_get_contents($url);
        $data = json_decode($response, true);

        // 如果請求成功並且有經緯度數據,返回經緯度
        if ($data && isset($data['coord'])) {
            return [
                'latitude' => $data['coord']['lat'],
                'longitude' => $data['coord']['lon']
            ];
        }

        return null;
    }
}

2.2 說明

SunsetService服務類中,我們提供了兩個主要的方法:

  • getSunsetTimeByCity() :接收一個城市名稱,返回該城市的日落時間。

  • getCoordinatesByCity() :使用外部API(如OpenWeatherMap API)根據城市名稱獲取該城市的經緯度。

getCoordinatesByCity()中,我們使用了OpenWeatherMap API 來獲取城市的經緯度信息。在實際應用中,你需要替換your_api_key為你自己申請的API 密鑰。

3. 創建一個控制器來使用服務

接下來,我們需要一個控制器來調用SunsetService服務,並返回結果給前端。我們可以通過以下命令生成控制器:

 php artisan make:controller SunsetController

然後,在app/Http/Controllers/SunsetController.php中使用該服務:

 namespace App\Http\Controllers;

use App\Services\SunsetService;
use Illuminate\Http\Request;

class SunsetController extends Controller
{
    protected $sunsetService;

    public function __construct(SunsetService $sunsetService)
    {
        $this->sunsetService = $sunsetService;
    }

    /**
     * 查詢城市的日落時間
     *
     * @param Request $request
     * @return \Illuminate\Http\Response
     */
    public function getSunsetTime(Request $request)
    {
        $city = $request->get('city', 'Beijing');
        $sunsetTime = $this->sunsetService->getSunsetTimeByCity($city);

        return response()->json([
            'city' => $city,
            'sunset_time' => $sunsetTime
        ]);
    }
}

3.1 路由配置

接下來,在routes/web.php中為該控制器添加路由:

 use App\Http\Controllers\SunsetController;

Route::get('/sunset', [SunsetController::class, 'getSunsetTime']);

通過這個路由,用戶可以通過瀏覽器訪問/sunset?city=北京來查詢北京的日落時間。

4. 測試

現在,你已經成功封裝了date_sunset()函數,並創建了一個按城市查詢日落時間的服務。你可以通過訪問以下URL 來測試這個功能:

 http://m66.net/sunset?city=Beijing

返回的JSON 數據將包含該城市的日落時間。

總結

通過封裝date_sunset()函數,我們可以輕鬆地在Laravel 中實現按城市查詢日落時間的功能。你可以根據具體需求,進一步擴展這個服務,比如增加緩存機制、支持不同的日期查詢等。希望本文能幫助你更好地理解如何在Laravel 中實現這一功能!