- Can I use this BoxNow bundle directly in Laravel, or is it only for Symfony?
- This bundle is designed for Symfony, but its core OAuth2 and pickup point logic can be adapted for Laravel. You’ll need to replace Symfony-specific components (like YAML config and PropertyInfo) with Laravel equivalents, such as `.env` for credentials and Laravel’s `HttpClient` for API calls. The service-oriented design (e.g., `AuthorizationService`) aligns well with Laravel’s facades.
- How do I install this bundle in a Laravel project?
- Since this is a Symfony bundle, you’ll need to manually register its services in a Laravel `ServiceProvider`. Start by requiring it via Composer (`composer require answear/boxnow-bundle`), then create a custom provider to bind the `AuthorizationService` and `PickupPointService` to Laravel’s container. Replace Symfony’s YAML config with a Laravel config file (e.g., `config/boxnow.php`) using `.env` for sensitive data like `clientId` and `clientSecret`.
- What Laravel versions does this bundle support?
- The bundle itself is Symfony-focused, but its core functionality (OAuth2 and API calls) works with Laravel 8.x and 9.x. You’ll need to handle version compatibility manually, especially for dependencies like Guzzle or Psr/Log. Test thoroughly with your Laravel version, as Symfony’s DI container and event system won’t integrate natively. Laravel’s `HttpClient` can replace Guzzle for API requests.
- How do I configure API credentials securely in Laravel?
- Store `clientId` and `clientSecret` in Laravel’s `.env` file, following Laravel’s security best practices. For production, consider using a secrets manager like HashiCorp Vault or Laravel’s built-in encryption for additional security. Avoid hardcoding credentials in config files or version-controlled repositories. The bundle’s `AuthorizationService` will read these values from your custom config setup.
- Does this bundle support caching pickup point data in Laravel?
- The bundle doesn’t include caching logic, but you can easily integrate Laravel’s cache drivers (e.g., Redis, file cache) to store pickup point responses. Use Laravel’s `cache()->remember()` helper or a dedicated service with TTL-based invalidation. For example, cache responses for 1 hour with `cache()->remember('boxnow_pickup_points', now()->addHours(1), fn() => $pickupPoints->getAll($token))`.
- How do I handle API errors like rate limits (429) or server errors (500) in Laravel?
- Laravel’s `HttpClient` throws exceptions for non-2xx responses, which you can catch and convert to Laravel exceptions (e.g., `BoxNowApiException`). For rate limits (429), implement exponential backoff using Laravel’s `retry()` helper or a custom retry service. Log errors with Laravel’s `Log::error()` and consider dispatching events (e.g., `BoxNowApiFailed`) for observability in your application.
- Are there alternatives to this bundle for Laravel?
- For Laravel, consider building a lightweight custom package using Laravel’s `HttpClient` for OAuth2 and API calls. Packages like `spatie/array-to-object` can replace Symfony’s `PropertyInfo` for DTO handling, and Laravel’s collections simplify data transformation. If you need a pre-built solution, check for Laravel-specific BoxNow integrations on Packagist or adapt Symfony bundles like this one with minimal effort.
- How do I test this bundle in a Laravel project?
- Mock the BoxNow API responses using Laravel’s `MockFacade` or `HttpClient` interceptors. Test the `AuthorizationService` by verifying token generation and expiration. For pickup points, mock the API to return test data and assert DTO responses. Use Laravel’s `Http` tests to simulate API calls, and validate error handling with fake exceptions. Example: `Http::fake([$apiUrl => Http::response($mockData)])`.
- Can this bundle support multi-tenancy (multiple BoxNow accounts for different regions)?
- Yes, but you’ll need to extend the bundle’s configuration. Store multiple `clientId/clientSecret` pairs in a database table (e.g., `boxnow_accounts`) and dynamically load them based on tenant context. Override the `AuthorizationService` to accept a tenant-specific config array. For regional filtering, use Laravel’s polymorphic relationships or a tenant-aware `RegionEnum` implementation.
- What’s the best way to handle BoxNow API versioning or breaking changes?
- Monitor BoxNow’s API documentation for versioning or deprecation notices. Abstract the bundle’s core logic into a Laravel-agnostic layer (e.g., a `BoxNowClient` class) to isolate API changes. Use Laravel’s `config()` to toggle between API endpoints or versions. For breaking changes, implement a migration strategy (e.g., feature flags) to update your app incrementally. Example: `config(['boxnow.api_url' => env('BOXNOW_API_URL_V2', env('BOXNOW_API_URL'))])`.