当前位置: 首页> 最新文章列表> 在 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 中实现这一功能!