omaralalwi/laravel-api-helpers
Installation
composer require omaralalwi/laravel-api-helpers
Publish the config (optional):
php artisan vendor:publish --provider="OmarAlalwi\ApiHelpers\ApiHelpersServiceProvider"
First Use Case Detect API version in a route or controller:
use OmarAlalwi\ApiHelpers\Facades\ApiHelpers;
$version = ApiHelpers::version(); // e.g., "v1"
Where to Look First
OmarAlalwi\ApiHelpers\Facades\ApiHelpers (primary entry point).config/api-helpers.php (customize versioning logic, headers, etc.).isApi(), clientIp(), authenticated(), etc.API Versioning
// Route: `/api/v1/users`
$version = ApiHelpers::version(); // "v1"
// Header: `X-API-Version: v2`
$version = ApiHelpers::version(); // "v2"
if (!ApiHelpers::version()->isAtLeast('v2')) {
abort(403, 'API v2 or higher required.');
}
Request Identification
if (ApiHelpers::isApi()) {
// API-specific logic (e.g., rate limiting, version checks)
}
Authentication
$user = ApiHelpers::authenticated();
if (ApiHelpers::authenticated()) {
// User is authenticated.
}
Request Metadata
$ip = ApiHelpers::clientIp();
$locale = ApiHelpers::locale();
$headers = ApiHelpers::headers();
ApiHelpers in middleware to enforce versioning or auth:
public function handle(Request $request, Closure $next) {
if (!ApiHelpers::version()->isAtLeast('v1')) {
return response()->json(['error' => 'Unsupported API version'], 400);
}
return $next($request);
}
ApiHelpers to a custom interface for type safety:
$this->app->bind(
\App\Contracts\ApiHelperInterface::class,
\OmarAlalwi\ApiHelpers\Facades\ApiHelpers::class
);
ApiHelpers in PHPUnit:
$this->app->instance(
\OmarAlalwi\ApiHelpers\Facades\ApiHelpers::class,
Mockery::mock(\OmarAlalwi\ApiHelpers\Contracts\ApiHelper::class)
);
Version Detection Logic
/api/v1/users/1/profile).version_pattern in config/api-helpers.php:
'version_pattern' => 'v([0-9]+)',
'version_header' => 'X-API-Version',
Authentication Ambiguity
ApiHelpers::authenticated() relies on Laravel's auth system. If using custom auth (e.g., API tokens), ensure the guard is set correctly.$user = ApiHelpers::authenticated('api');
Locale Fallback
ApiHelpers::locale() may return null if no locale is set.'default_locale' => 'en',
Secure Request Checks
ApiHelpers::isSecure() checks for HTTPS, but may not account for local development (e.g., localhost).'ignore_secure_check_for_ips' => ['127.0.0.1', '::1'],
\Log::debug('API Version:', ['version' => ApiHelpers::version()->value()]);
\Log::debug('Request Headers:', ApiHelpers::headers()->all());
Custom Version Logic
Extend the Version class to add logic (e.g., semantic versioning):
namespace App\Extensions;
use OmarAlalwi\ApiHelpers\Version;
class CustomVersion extends Version {
public function isAtLeast(string $version): bool {
// Custom logic (e.g., compare semantic versions)
return parent::isAtLeast($version);
}
}
Bind it in a service provider:
$this->app->bind(
\OmarAlalwi\ApiHelpers\Contracts\Version::class,
\App\Extensions\CustomVersion::class
);
Add Request Helpers
Publish and extend the helpers.php file:
php artisan vendor:publish --tag=api-helpers-helpers
Add custom methods to the ApiHelpers facade.
Override Config Defaults Publish the config and customize:
php artisan vendor:publish --provider="OmarAlalwi\ApiHelpers\ApiHelpersServiceProvider"
Example: Change the API route prefix:
'api_prefix' => 'app', // Routes like `/app/v1/...`
$version = cache()->remember('api_version', now()->addHours(1), function() {
return ApiHelpers::version();
});
ApiHelpers instance in a singleton or container.How can I help you explore Laravel packages today?