Maison > Article > développement back-end > 在云中构建天气跟踪应用程序,第 2 部分
在第 1 部分 中,我介绍了如何创建一个基础 PHP 应用程序,并使用一个在线服务检索并存储世界城市的经纬度坐标。
现在让我们添加来自 IBM 的新 Insights for Weather 服务,并开始使用来自第 1 部分的城市信息跟踪您选择的 5 个世界城市的天气。您还将了解如何将您的最终应用程序托管在 IBM Bluemix 上。
运行示例应用程序
获取示例应用程序的代码
参见第 1 部分 了解必备知识和软件。
因为存储数据库中的每个位置记录还包含该位置的纬度和经度,所以您现在可以将您的应用程序与 Insights for Weather 服务相集成。最初,此服务实例将在一种未绑定状态下运行;这使您能够在本地开发应用程序,而将服务实例本身远程托管在 Bluemix 上。
阅读: Insights for Weather 入门
<?php// index page handlers$app->get('/', function () use ($app) { return $app->redirect($app["url_generator"]->generate('index'));});$app->get('/index', function () use ($app, $db) { // get list of locations from database // for each location, get current weather from Weather service $collection = $db->locations; $locations = iterator_to_array($collection->find()); foreach ($locations as &$location) { $uri = $app->config['weather_uri'] . '/api/weather/v2/observations/current?units=m&language=en-US&geocode=' . urlencode(sprintf('%f,%f', $location['lat'], $location['lng'])); $json = file_get_contents($uri); if ($json === FALSE) { throw new Exception("Could not connect to Weather API."); } $location['weather'] = json_decode($json, true); } return $app['twig']->render('index.twig', array('locations' => $locations));})->bind('index');
<div data-role="content"> <h2 class="ui-bar ui-bar-a">Current Weather</h2> <div class="ui-body"> <ul data-role="listview" data-split-icon="minus" data-split-theme="d"> {% for item in locations %} <li> <a href="{{ app.url_generator.generate('forecast', {'id': item._id|trim}) }}" data-ajax="false">{{ item.location }}, {{ item.country }} <br/> {{ item.weather.observation.metric.temp }}° C | {{ item.weather.observation.phrase_22char }} </a> <a href="{{ app.url_generator.generate('delete', {'id': item._id|trim}) }}" data-ajax="false">Remove</a> </li> {% endfor %} </ul> </div> <div> <p><a href="{{ app.url_generator.generate('search') }}" data-ajax="false" data-inline="true" data-role="button" data-icon="plus" data-theme="a">Add Location</a></p> </div> </div>
请注意,每个位置的旁边都有一个 Delete 按钮,它链接到 /delete 路由处理函数,并将该位置的唯一 MongoDB 记录标识符传递给此处理函数。 /delete 处理函数将从 MongoDB 数据库中删除指定的记录:
<?php// handler to remove location from database$app->get('/delete/{id}', function ($id) use ($app, $db) { $collection = $db->locations; $collection->remove(array('_id' => new MongoId($id))); return $app->redirect($app["url_generator"]->generate('index'));})->bind('delete');
<?php// handler to display 7-day forecast for selected location$app->get('/forecast/{id}', function ($id) use ($app, $db) { // look up location record in database // connect and get forecast from Weather service $collection = $db->locations; $location = (array)$collection->findOne(array('_id' => new MongoId($id))); $uri = $app->config['weather_uri'] . '/api/weather/v2/forecast/daily/10day?units=m&language=en-US&geocode=' . urlencode(sprintf('%f,%f', $location['lat'], $location['lng'])); $json = file_get_contents($uri); if ($json === FALSE) { throw new Exception("Could not connect to Weather API."); } $location['weather'] = json_decode($json, true); return $app['twig']->render('forecast.twig', array('data' => $location));})->bind('forecast');
此刻,该应用程序已完成,您可以将它部署到 Bluemix 了。
---applications:- name: weather-tracker-[initials]memory: 256Minstances: 1host: weather-tracker-[initials]buildpack: https://github.com/cloudfoundry/php-buildpack.gitstack: cflinuxfs2
<?phpif ($services = getenv("VCAP_SERVICES")) { $services_json = json_decode($services, true); $app->config['weather_uri'] = $services_json["weatherinsights"][0]["credentials"]["url"];}
shell> cf api https://api.ng.bluemix.netshell> cf loginshell> cf pushshell> cf bind-service weather-tracker-[initials] "Insights for Weather-[id]"shell> cf restage weather-tracker-[initials]
现在可以浏览到应用程序清单中指定的主机来开始使用该应用程序,例如 http://weather-tracker- [initials] .mybluemix.net。如果看到一个空白页或其他错误,可以尝试调试您的 PHP 代码来查找出错的地方。
阅读: 在 IBM Bluemix 上调试 PHP 错误
Insights for Weather 服务使得将特定于位置的天气数据和预报添加到移动或 Web 应用程序变得很容易。因为您可以通过 REST API 访问该服务,因此可以将它与任何编程语言相集成。此外,因为该服务托管在 Bluemix 上,所以很容易将它连接到您由 Bluemix 托管的应用程序,只需将该服务绑定到您的应用程序并重新载入它。
您可以从上面的链接下载本教程中实现的所有代码,以及 PHP buildpack 的配置文件。推荐您获取该代码,使用它,并尝试添加一些新特性。我保证您不会造成任何破坏,而且它肯定对您的学习有所帮助。祝您开发愉快!