stejac/mite-bundle
Symfony bundle for integrating Mite time tracking into PHP applications. It provides configurable services around the Mite API to manage projects, services, and time entries, making it easier to add time-tracking features to Symfony apps.
Architecture fit. The most important finding is a framing mismatch: stejac/mite-bundle is a Symfony bundle, not a Laravel package. Laravel does not consume bundles — it registers service providers. The configuration surface (domain, api_key, user_agent, http_client) is Symfony Configuration-tree shaped, so in Laravel you must either (a) instantiate the typed resource services manually, or (b) own a thin Laravel service provider that reconstructs the container definitions. The DTOs, enums, input DTOs and exceptions are likely framework-agnostic value objects and the real value of the release; the bundle scaffolding is the part that does not port. Domain fit is good if the product surfaces time tracking, project/customer billing, service catalogues, revenue reporting, or tracker control — the typed surface per resource plus grouped time-entry reports and daily aliases maps cleanly onto reporting features.
Integration feasibility. composer require works in any PHP project; the bundle bootstraps only inside a Symfony kernel. A Laravel adoption is a half-day to three-day spike (wire one service, hit GET /account), after which the adapter is your code to own. Native Symfony adoption is near-zero effort.
Technical risk.
MiteExceptionInterface is mandatory.If-None-Match yet (planned), no documented retry/backoff, no webhooks; the changes feed implies polling. Every read is a full round trip today.Key questions.
symfony/* version constraints — does it hard-require symfony/framework-bundle (dependency-weight and conflict risk in a Laravel app)?http_client accept any PSR-18 client, so we can inject Laravel's HTTP client and a mock in tests?Stack fit. PHP 8.x + Composer. Native on Symfony 6/7. On Laravel it is consumed as a library, not a bundle. The http_client injection point is the critical seam: routing traffic through Laravel's HTTP client gives you logging, retries, timeouts and tracing for free, and makes the whole surface mockable.
Migration path. Introduce the package behind an internal port (MiteClient interface) so domain code never imports third-party classes. Implement the adapter over the typed services. If replacing an existing bespoke client or another mite SDK, run both in shadow mode for reads and diff the outputs before cutting over. Convert resources in order of increasing blast radius: reference data first, then time-entry reads and reports, then writes.
Compatibility. Verify constraints before committing — Symfony-bundle packages commonly pull symfony/framework-bundle, which bloats or conflicts inside a Laravel application. Confirm no bootstrap side effects at autoload time and that configuration can be supplied programmatically rather than via YAML.
Sequencing.
GET /account.config/*.php defaults.Maintenance. Single-maintainer, first release. Plan to own a vendored copy or fork; pin exact versions and review diffs on every upgrade. Budget roughly 1–2 days per quarter for upgrades and upstream-API drift triage.
Support. No vendor SLA. The real upstream dependency is mite's REST API, whose change policy is the dominant risk. Instrument the adapter to alert on unmapped exception types as an early warning of API drift, and keep the ability to patch in-house without waiting on the maintainer.
Scaling. Load will be read-heavy. Without ETag support, polling the changes feed or refreshing reports is a full request every time — treat the mite rate limit as the binding constraint and implement client-side throttling and queueing in the adapter rather than assuming the package does it. Persist reference data locally and refresh on a schedule plus the changes feed. Batch reporting windows rather than issuing per-day calls.
Failure modes.
Ramp-up. Symfony developers: hours. Laravel-only developers: 1–2 days for bundle wiring, DI configuration and the service-provider wrapper, plus roughly half a day for the mite domain model (time entry vs. service vs. project, billable semantics, grouped-report aggregation). Author internal "how we call mite" documentation — the package README targets Symfony and will mislead a Laravel audience.
How can I help you explore Laravel packages today?