tito10047/php-callendar
Composer 安装命令:
composer require tito10047/php-callendar
包简介
Framework-agnostic PHP calendar data library — monthly, weekly and work-week grids, RFC 5545 recurrence rules, iCal import/export, and resource scheduling.
README 文档
README
Pure PHP calendar library. Zero dependencies. Built for server-side rendering.
Feed it a date. Get back a typed Day[][] table. Build your own template.
Why server-side?
- Works with Symfony UX Turbo / Livewire — no hydration, no client state sync
- Zero frontend dependencies — just your own HTML and CSS
- Every cell carries arbitrary data attached via a simple interface
- Fully immutable — every mutation returns a new instance
Installation
composer require tito10047/php-calendar
Requires PHP 8.2+. No other dependencies.
Quick start
use Tito10047\Calendar\Calendar; use Tito10047\Calendar\Enum\CalendarType; use Tito10047\Calendar\Enum\DayName; $calendar = Calendar::forMonth(2024, 11) ->disableDaysByName(DayName::Saturday, DayName::Sunday) ->setDataLoader(new MyEventLoader()); $table = $calendar->getDaysTable(); // array<int weekNumber, array<int isoDay 1–7, Day>>
<table class="calendar"> <tbody> {% for week in table %} <tr> {% for day in week %} <td class="{{ day.ghost ? 'ghost' : '' }} {{ day.today ? 'today' : '' }} {{ day.enabled ? '' : 'disabled' }}"> {% if not day.ghost %} <span>{{ day.date|date('j') }}</span> {% for event in day.data ?? [] %} <div class="event">{{ event.title }}</div> {% endfor %} {% endif %} </td> {% endfor %} </tr> {% endfor %} </tbody> </table>
The Day object
Every cell is a readonly value object:
$day->date // DateTimeImmutable $day->ghost // belongs to adjacent month (grid padding, Monthly only) $day->today // matches today's date $day->enabled // not disabled by any rule $day->data // ?array — whatever your DayDataLoaderInterface returned
Calendar types
Calendar::forMonth(2024, 11) // full month, aligned to complete weeks Calendar::forWeek(new DateTimeImmutable('2024-11-04')) // one week, Mon–Sun Calendar::forToday(CalendarType::WorkWeek) // this week, Mon–Fri
Or with navigation:
$next = $calendar->nextPeriod(); // next month / next week — depends on type $prev = $calendar->prevPeriod();
Disable and enable days
Three independent layers — see docs/disable-model.md for the full model.
$calendar = Calendar::forMonth(2024, 11) ->disableDaysByName(DayName::Saturday, DayName::Sunday) // structural — survives navigation ->disableDays(new DateTimeImmutable('2024-11-11')) // date-specific — resets on navigation ->enableDays(new DateTimeImmutable('2024-11-30')); // exception — override for one date
Further reading
| Topic | File |
|---|---|
| Disable / enable model (three layers) | docs/disable-model.md |
| Attaching custom data to days | docs/data-loading.md |
| Navigation, caching, CalendarConfig | docs/navigation.md |
| Recurring events (RFC 5545 RRULE) | docs/recurrence.md |
| iCal import and export | docs/ical.md |
| Resource calendar (rooms, people, vehicles) | docs/resource-calendar.md |
| Booking system pattern | docs/booking-mode.md |
Running tests
composer install vendor/bin/phpunit
CI runs across PHP 8.2–8.5 on every push.
License
MIT
tito10047/php-callendar 适用场景与选型建议
tito10047/php-callendar 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 98 次下载、GitHub Stars 达 1, 最近一次更新时间为 2025 年 03 月 10 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 tito10047/php-callendar 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 tito10047/php-callendar 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 98
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 17
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: Unknown
- 更新时间: 2025-03-10