3 de septiembre de 2024 • 7 min de lectura
Especialista en IA y Automatización
Diseño sistemas de comunicación impulsados por IA. Mi trabajo se centra en agentes de voz, chatbots de WhatsApp, asistentes de IA y automatización de flujos, construidos principalmente sobre Twilio, n8n y LLM modernos como OpenAI y Claude. En los últimos 7 años he entregado más de 30 proyectos de automatización que manejan más de 250 000 interacciones mensuales.
Si te gusta el contenido que hago, puedes suscribirte y recibir información valiosa por correo. No se envía spam, solo novedades sobre publicaciones interesantes o contenido especializado del que hablo.
Integrar Google Calendar en tu aplicación Laravel te cambia el juego, sobre todo si necesitás manejar eventos, agendar turnos o seguir vencimientos. En esta guía te llevo por todo el proceso, desde configurar la API de Google hasta sincronizar eventos en tu app Laravel.
Antes de meternos en el código, asegurate de tener esto:
Lo primero es crear las credenciales para la API de Google Calendar.
http://yourapp.com/oauth2callback.Ya con las credenciales, vamos a instalar la Google Client Library en la app Laravel. Esta librería simplifica bastante el trabajo contra las APIs de Google.
composer require google/apiclient:^2.0
Ahora sumá las credenciales de la API de Google a tu archivo .env. Así los datos sensibles quedan afuera del repo y podés cambiar la configuración entre entornos sin tocar código.
GOOGLE_CLIENT_ID=your-client-id
GOOGLE_CLIENT_SECRET=your-client-secret
GOOGLE_REDIRECT_URI=http://yourapp.com/oauth2callback
Acordate de reemplazar los placeholders por tu client ID, tu client secret y tu redirect URI reales.
Para mantener el código ordenado, vamos a crear una clase de service que concentre todas las interacciones con la API de Google Calendar.
Creá la clase de service: en el directorio app/Services, creá una clase nueva llamada GoogleCalendarService.php.
<?php
namespace App\Services;
use Google\Client;
use Google\Service\Calendar;
class GoogleCalendarService {
protected $client;
protected $calendarService;
public function __construct() {
$this->client = new Client();
$this->client->setClientId(config('services.google.client_id'));
$this->client->setClientSecret(config('services.google.client_secret'));
$this->client->setRedirectUri(config('services.google.redirect'));
$this->client->addScope(Calendar::CALENDAR);
$this->calendarService = new Calendar($this->client);
}
public function authenticate($code) {
$this->client->authenticate($code);
session(['google_access_token' => $this->client->getAccessToken()]);
}
public function getClient() {
if (session('google_access_token')) {
$this->client->setAccessToken(session('google_access_token'));
}
return $this->client;
}
public function listEvents($calendarId = 'primary') {
$this->getClient();
$events = $this->calendarService->events->listEvents($calendarId);
return $events->getItems();
}
public function createEvent($eventData, $calendarId = 'primary') {
$this->getClient();
$event = new \Google\Service\Calendar\Event($eventData);
$event = $this->calendarService->events->insert($calendarId, $event);
// You can also insert the event in DB to retrieve it from there later
return $event;
}
}
Esta clase maneja la autenticación, el listado de eventos y la creación de eventos en Google Calendar.
Para que los usuarios se autentiquen con su cuenta de Google, vamos a armar las rutas y los controladores del flujo de OAuth.
Rutas: agregá estas rutas en tu archivo web.php:
use App\Http\Controllers\GoogleCalendarController;
Route::get('auth/google', [GoogleCalendarController::class, 'redirectToGoogle']);
Route::get('auth/google/callback', [GoogleCalendarController::class, 'handleGoogleCallback']);
Controlador: creá un GoogleCalendarController.php en el directorio app/Http/Controllers.
<?php
namespace App\Http\Controllers;
use App\Services\GoogleCalendarService;
use Illuminate\Http\Request;
class GoogleCalendarController extends Controller {
protected $googleService;
public function __construct(GoogleCalendarService $googleService) {
$this->googleService = $googleService;
}
public function redirectToGoogle() {
return redirect()->away($this->googleService->getClient()->createAuthUrl());
}
public function handleGoogleCallback(Request $request) {
$this->googleService->authenticate($request->get('code'));
return redirect('/')->with('success', 'Google Calendar connected!');
}
}
Este controlador se encarga de redirigir a los usuarios a la consent screen de OAuth de Google y de procesar el callback.
Con la autenticación lista, ya podemos interactuar con Google Calendar. Vamos a mostrar una lista de eventos en una vista simple.
Sumá un método al controlador: actualizá GoogleCalendarController.php con un método para mostrar los eventos.
public function showEvents() {
$events = $this->googleService->listEvents();
return view('events.index', compact('events'));
}
Creá la vista: en el directorio resources/views/events/, creá un archivo index.blade.php.
@extends('layouts.app')
@section('content')
<h1>Google Calendar Events</h1>
@if(count($events) > 0)
<ul>
@foreach($events as $event)
<li>{{ $event->getSummary() }} ({{ $event->getStart()->getDateTime() }})</li>
@endforeach
</ul>
@else
<p>No events found.</p>
@endif
@endsection
Esta vista recorre los eventos que trae Google Calendar y los muestra.
Para crear un evento nuevo necesitamos un formulario donde los usuarios carguen los datos.
Creá el formulario: agregá un formulario a la vista index.blade.php para crear eventos.
<form action="{{ route('events.store') }}" method="POST">
@csrf
<input type="text" name="summary" placeholder="Event Title">
<input type="datetime-local" name="start">
<input type="datetime-local" name="end">
<button type="submit">Add Event</button>
</form>
Guardá el evento: sumá un método en GoogleCalendarController.php para manejar el envío del formulario.
public function storeEvent(Request $request) {
$eventData = [
'summary' => $request->summary,
'start' => ['dateTime' => $request->start],
'end' => ['dateTime' => $request->end],
];
$event = $this->googleService->createEvent($eventData);
return redirect()->back()->with('success', 'Event created: ' . $event->getSummary()); }
Agregá la ruta: por último, sumá una ruta para manejar la creación del evento.
Route::post('events', [GoogleCalendarController::class, 'storeEvent'])->name('events.store');Hay paquetes de terceros que ya traen parte de esta funcionalidad, pero hacerlo a mano sirve para aprender, o si querés control total del codebase de tu plataforma. Y a su vez quedás vos a cargo de mantener el código. Eso es bueno: si vas por un paquete de terceros, ese paquete puede quedar desactualizado durante años.
También conviene estirar el concepto y armar algo de automatización. Por ejemplo, un cron job que traiga los eventos cada X minutos, los guarde en la DB y después los muestre en un calendario. Así te ahorrás llamadas a la API, mejorás el rendimiento y empezás a combinar piezas de lo que podría ser un SaaS.
Como ves, integrar Google Calendar es relativamente fácil, sobre todo en la fase de desarrollo. Tené en cuenta que cuando pases a producción, Google tiene que revisar tu aplicación, y para eso hay que presentar documentación (política de privacidad, EULA, términos de uso, etc.)
¿Te sirvió el post? ¡Compartilo!
-Gonza
Descubre cuánto te está costando tu sistema de comunicaciones.
Obtén la auditoría de comunicaciones