composer require blairpaul09/calendar
php artisan vendor:publish --provider="Calendar\Providers\CalendarServiceProvider"
php artisan migrate
User model:
use Calendar\Models\Traits\InteractsWithCalendar;
class User extends Authenticatable {
use InteractsWithCalendar;
}
$user = User::find(1);
$event = CalendarEventBuilder::for($user)
->startAt(now()->format('Y-m-d'))
->endAt(now()->addDays(30)->format('Y-m-d'))
->time('09:00', '10:00')
->daily()
->title('Daily Standup')
->save();
CalendarEventBuilder::for($user)
->startAt(now()->format('Y-m-d'))
->time('14:00', '15:00')
->title('Team Lunch')
->save();
CalendarEventBuilder::for($user)
->startAt(now()->format('Y-m-d'))
->endAt(now()->addYears(1)->format('Y-m-d'))
->time('08:00', '09:00')
->weekly()
->title('Weekly Sync')
->save();
$user->events()->get();
$user->events()
->whereBetween('start_at', [$startDate, $endDate])
->get();
config/calendar.php:
'allow_reminder' => true,
CalendarEventBuilder::for($user)
->startAt(now()->format('Y-m-d'))
->time('10:00', '11:00')
->reminders([
['type' => 'minutes', 'nth' => 30],
['type' => 'hours', 'nth' => 1],
])
->title('Meeting')
->save();
$timezone = 'America/New_York';
$event = CalendarEventBuilder::for($user)
->startAt(now($timezone)->format('Y-m-d'))
->time('10:00', '11:00')
->title('Timezone Test')
->save();
$events = $user->events()
->get()
->map(fn ($event) => [
'title' => $event->title,
'start' => $event->start_at->format('Y-m-d\TH:i:s'),
'end' => $event->end_at->format('Y-m-d\TH:i:s'),
'timezone' => $event->timezone,
]);
Timezone Handling:
$event->start_at->setTimezone('Asia/Manila')->format('Y-m-d H:i:s');
Recurrence Rules:
rlanvin/php-rrule for recurrence. Complex rules (e.g., "every 2nd Monday") may require manual RRULE string input:
->recurrenceRule('FREQ=WEEKLY;BYDAY=2SU')
Migration Conflicts:
calendar_events table already exists, migrations may fail. Backup your database before running php artisan migrate.Reminder Limitations:
Performance:
whereBetween with reasonable ranges:
$user->events()
->whereBetween('start_at', [now()->startOfMonth(), now()->endOfMonth()])
->get();
\Log::info('Event data:', $event->toArray());
Custom Event Models:
CalendarEvent model to add fields:
class CustomEvent extends CalendarEvent {
protected $casts = [
'custom_field' => 'string',
];
}
use Calendar\Models\Traits\InteractsWithCalendar as InteractsWithCustomCalendar;
Add Event Categories/Tags:
// Migration
Schema::create('event_categories', function (Blueprint $table) {
$table->id();
$table->foreignId('event_id')->constrained();
$table->string('category');
$table->timestamps();
});
// Trait extension
public function categories() {
return $this->hasMany(EventCategory::class);
}
Sync with External Calendars:
$event->toIcs(); // Hypothetical method; may require custom implementation.
Override Default Timezone:
config/calendar.php:
'default_timezone' => 'UTC',
->timezone('Asia/Tokyo')
Soft Deletes:
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable {
use InteractsWithCalendar, SoftDeletes;
}
deleted_at column.How can I help you explore Laravel packages today?