This Laravel weather app, initially designed for voice calls, now supports SMS communication. This enhancement involves adding routes, modifying the service layer, and creating an SMS controller to handle incoming text messages.
Route Additions:
The routes/web.php
file is updated to include an SMS route group:
Route::group(['prefix' => 'sms', 'middleware' => 'twilio'], function () { Route::post('weather', 'SmsController@showWeather')->name('weather'); });
This /sms/weather
route handles all incoming SMS messages, leveraging Twilio's POST requests.
Service Layer Modification:
The app/Services/WeatherService.php
file's getWeather
method is revised to accommodate SMS:
public function getWeather($zip, $dayName, $forSms = false) { // ... (Existing code to retrieve weather data remains unchanged) ... $weather = $day->name; $weather .= ' the ' . $tsObj->format('jS') . ': '; $response = new Twiml(); if ($forSms) { $remainingChars = 140 - strlen($weather); // ... (Condensed weather forecast for SMS, limited to 140 characters) ... $response->message($weather); } else { // ... (Existing code for voice responses remains unchanged) ... } return $response; }
The key change is the addition of $forSms
parameter. If true, the forecast is shortened to fit within SMS character limits.
SMS Controller:
A new SmsController.php
is created in app/Http/Controllers
:
<?php namespace App\Http\Controllers; use App\Services\WeatherService; use Illuminate\Http\Request; use Twilio\Twiml; class SmsController extends Controller { // ... (Constructor and dependencies remain the same) ... public function showWeather(Request $request) { $parts = $this->parseBody($request); switch ($parts['command']) { case 'zipcode': // ... (Handle zipcode input) ... break; case 'day': // ... (Handle day of week input) ... break; case 'credits': // ... (Handle credits request) ... break; default: // ... (Handle default/unknown input) ... break; } return $response; } private function parseBody($request) { // ... (Parses the SMS body to determine user intent) ... } }
This controller's showWeather
method uses parseBody
to interpret the SMS message and calls getWeather
with appropriate parameters. parseBody
identifies zip codes, days of the week, and credit requests.
Twilio Configuration:
Update your Twilio phone number settings to point the SMS webhook to your application's /sms/weather
endpoint (using your Ngrok URL).
App Usage:
Send an SMS with a zip code to your Twilio number to receive the weather forecast. Subsequent messages can specify a day of the week or request credits.
This enhanced Laravel application demonstrates a robust and flexible way to handle both voice and SMS interactions using Twilio. The code provides a clear example of how to extend the functionality to support a new communication channel. Remember to replace placeholder comments with the actual code from the original response.
The above is the detailed content of Hello, Laravel? Communicating with PHP through SMS!. For more information, please follow other related articles on the PHP Chinese website!