PHPackages                             dsolodev/laraflare - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. dsolodev/laraflare

ActiveLibrary[API Development](/categories/api)

dsolodev/laraflare
==================

Cloudflare Client API v4 for Laravel

1.0.0(7mo ago)01MITPHPPHP ^8.4

Since Oct 6Pushed 7mo agoCompare

[ Source](https://github.com/dsolodev/laraflare)[ Packagist](https://packagist.org/packages/dsolodev/laraflare)[ RSS](/packages/dsolodev-laraflare/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (6)Versions (2)Used By (0)

Laraflare - Cloudflare API Client for Laravel
=============================================

[](#laraflare---cloudflare-api-client-for-laravel)

A modern, type-safe Cloudflare API v4 client for Laravel applications.

Features
--------

[](#features)

- ✅ Full support for Cloudflare API v4
- ✅ Multiple authentication strategies (Bearer Token &amp; API Key)
- ✅ Type-safe with PHPStan Level 9
- ✅ PSR-7 HTTP message implementation
- ✅ Automatic JSON response decoding
- ✅ Debug mode for request/response inspection
- ✅ Mock service for testing
- ✅ Laravel auto-discovery support

Requirements
------------

[](#requirements)

- PHP 8.4 or higher
- Laravel 11.0 or higher
- Guzzle HTTP 7.0 or higher

Installation
------------

[](#installation)

Install via Composer:

```
composer require dsolodev/laraflare
```

### Publish Configuration

[](#publish-configuration)

```
php artisan vendor:publish --provider="dsolodev\Cloudflare\Providers\CloudflareServiceProvider"
```

This will create a `config/cloudflare.php` configuration file.

Configuration
-------------

[](#configuration)

### Environment Variables

[](#environment-variables)

#### Bearer Token Authentication (Recommended)

[](#bearer-token-authentication-recommended)

Modern API tokens provide scoped access and better security:

```
# Required: Your Cloudflare account email
CLOUDFLARE_USERNAME=your-email@example.com

# Required: Your Cloudflare API token
CLOUDFLARE_TOKEN=your-api-token-here

# Optional: Authentication strategy (defaults to Bearer)
CLOUDFLARE_AUTH_STRATEGY=Bearer

# Optional: Driver mode (api, log, or null for mock)
CLOUDFLARE_DRIVER=api
```

To create an API token:

1. Go to Cloudflare Dashboard → My Profile → API Tokens
2. Click "Create Token"
3. Select a template or create a custom token with required permissions

#### API Key Authentication (Legacy)

[](#api-key-authentication-legacy)

For backward compatibility with legacy Global API keys:

```
# Required: Your Cloudflare account email
CLOUDFLARE_USERNAME=your-email@example.com

# Required: Your Cloudflare Global API key
CLOUDFLARE_API_KEY=your-global-api-key

# Required: Set auth strategy to ApiKey
CLOUDFLARE_AUTH_STRATEGY=ApiKey

# Optional: Driver mode (api, log, or null for mock)
CLOUDFLARE_DRIVER=api
```

To find your Global API key:

1. Go to Cloudflare Dashboard → My Profile → API Tokens
2. View your "Global API Key"

### Authentication Strategies

[](#authentication-strategies)

The package automatically selects the correct credential based on `CLOUDFLARE_AUTH_STRATEGY`:

- **`Bearer`** (default) - Uses `CLOUDFLARE_TOKEN` for modern API tokens
- **`ApiKey`** - Uses `CLOUDFLARE_API_KEY` for legacy Global API keys

### Driver Modes

[](#driver-modes)

- `api` - Normal operation (default)
- `log` - Mock service with logging enabled
- `null` - Mock service without logging

Usage
-----

[](#usage)

### Basic Usage

[](#basic-usage)

#### Using Facade

[](#using-facade)

```
use dsolodev\Cloudflare\Facades\Cloudflare;

// List all zones
$zones = Cloudflare::get('zones');

// Get specific zone
$zone = Cloudflare::get('zones/zone-id');

// Create DNS record
$record = Cloudflare::post('zones/zone-id/dns_records', [
    'type' => 'A',
    'name' => 'example.com',
    'content' => '192.0.2.1',
    'ttl' => 3600,
    'proxied' => true,
]);

// Update DNS record
$updated = Cloudflare::patch('zones/zone-id/dns_records/record-id', [
    'content' => '192.0.2.2',
]);

// Delete DNS record
$result = Cloudflare::delete('zones/zone-id/dns_records/record-id');
```

#### Using Dependency Injection

[](#using-dependency-injection)

```
use dsolodev\Cloudflare\Services\CloudflareService;

class DnsController extends Controller
{
    public function __construct(
        private CloudflareService $cloudflare
    ) {}

    public function index()
    {
        $zones = $this->cloudflare->get('zones');

        return view('dns.index', compact('zones'));
    }

    public function createRecord(Request $request)
    {
        $record = $this->cloudflare->post("zones/{$request->zone_id}/dns_records", [
            'type' => $request->type,
            'name' => $request->name,
            'content' => $request->content,
            'ttl' => $request->ttl ?? 1,
            'proxied' => $request->proxied ?? false,
        ]);

        return response()->json($record);
    }
}
```

### Available Methods

[](#available-methods)

All methods return decoded JSON as PHP arrays:

```
// GET request
$data = Cloudflare::get(string $endpoint, array $queryParams = []): array

// POST request
$data = Cloudflare::post(string $endpoint, array $data = [], array $options = []): array

// PUT request
$data = Cloudflare::put(string $endpoint, array $data = [], array $options = []): array

// PATCH request
$data = Cloudflare::patch(string $endpoint, array $data = [], array $options = []): array

// DELETE request
$data = Cloudflare::delete(string $endpoint, array $data = [], array $options = []): array
```

### Query Parameters

[](#query-parameters)

Pass query parameters as an array:

```
$zones = Cloudflare::get('zones', [
    'status' => 'active',
    'page' => 1,
    'per_page' => 20,
    'order' => 'name',
    'direction' => 'asc',
]);
```

### Working with Responses

[](#working-with-responses)

All responses are automatically decoded JSON arrays:

```
$response = Cloudflare::get('zones');

// Check if request was successful
if ($response['success']) {
    foreach ($response['result'] as $zone) {
        echo $zone['name'] . "\n";
    }
}

// Handle errors
if (!empty($response['errors'])) {
    foreach ($response['errors'] as $error) {
        echo "Error: {$error['message']}\n";
    }
}
```

### Debug Mode

[](#debug-mode)

Access debug information for the last request:

```
use dsolodev\Cloudflare\Facades\Cloudflare;

$zones = Cloudflare::get('zones');

$debug = Cloudflare::getDebug();

// Request details
dump($debug->lastRequestHeaders);
dump($debug->lastRequestBody);

// Response details
dump($debug->lastResponseCode);
dump($debug->lastResponseHeaders);

// Errors
dump($debug->lastResponseError);
```

### Mock Service for Testing

[](#mock-service-for-testing)

Enable mock mode in your test environment:

```
// In .env.testing
CLOUDFLARE_DRIVER=log
```

Or programmatically:

```
use dsolodev\Cloudflare\Services\CloudflareMockService;

$mock = new CloudflareMockService(enableLogging: true);

$result = $mock->get('zones');
// Returns: ['mocked' => true, 'method' => 'get', 'endpoint' => 'zones']
```

Common Examples
---------------

[](#common-examples)

### Zone Management

[](#zone-management)

```
// List zones
$zones = Cloudflare::get('zones');

// Get zone details
$zone = Cloudflare::get("zones/{$zoneId}");

// Update zone settings
$settings = Cloudflare::patch("zones/{$zoneId}/settings/ssl", [
    'value' => 'flexible',
]);

// Purge cache
$result = Cloudflare::post("zones/{$zoneId}/purge_cache", [
    'purge_everything' => true,
]);
```

### DNS Records

[](#dns-records)

```
// List DNS records
$records = Cloudflare::get("zones/{$zoneId}/dns_records", [
    'type' => 'A',
    'name' => 'example.com',
]);

// Create A record
$record = Cloudflare::post("zones/{$zoneId}/dns_records", [
    'type' => 'A',
    'name' => 'subdomain.example.com',
    'content' => '192.0.2.1',
    'ttl' => 1,
    'proxied' => true,
]);

// Update DNS record
$updated = Cloudflare::put("zones/{$zoneId}/dns_records/{$recordId}", [
    'type' => 'A',
    'name' => 'subdomain.example.com',
    'content' => '192.0.2.2',
    'ttl' => 1,
    'proxied' => true,
]);

// Delete DNS record
$result = Cloudflare::delete("zones/{$zoneId}/dns_records/{$recordId}");
```

### Firewall Rules

[](#firewall-rules)

```
// List firewall rules
$rules = Cloudflare::get("zones/{$zoneId}/firewall/rules");

// Create firewall rule
$rule = Cloudflare::post("zones/{$zoneId}/firewall/rules", [
    'filter' => [
        'expression' => '(http.request.uri.path contains "/api")',
    ],
    'action' => 'block',
    'description' => 'Block API access',
]);
```

### Page Rules

[](#page-rules)

```
// List page rules
$pageRules = Cloudflare::get("zones/{$zoneId}/pagerules");

// Create page rule
$rule = Cloudflare::post("zones/{$zoneId}/pagerules", [
    'targets' => [
        [
            'target' => 'url',
            'constraint' => [
                'operator' => 'matches',
                'value' => '*example.com/admin/*',
            ],
        ],
    ],
    'actions' => [
        [
            'id' => 'ssl',
            'value' => 'full',
        ],
    ],
    'status' => 'active',
]);
```

Error Handling
--------------

[](#error-handling)

```
use dsolodev\Cloudflare\Http\Exceptions\ApiResponseException;
use dsolodev\Cloudflare\Http\Exceptions\AuthException;
use GuzzleHttp\Exception\GuzzleException;

try {
    $zones = Cloudflare::get('zones');
} catch (AuthException $e) {
    // Authentication failed
    Log::error('Cloudflare auth error: ' . $e->getMessage());
} catch (ApiResponseException $e) {
    // API returned an error
    Log::error('Cloudflare API error: ' . $e->getMessage());
} catch (GuzzleException $e) {
    // Network or HTTP error
    Log::error('HTTP error: ' . $e->getMessage());
}
```

Advanced Usage
--------------

[](#advanced-usage)

### Custom HTTP Client

[](#custom-http-client)

Inject a custom HTTP adapter:

```
use dsolodev\Cloudflare\Http\Adapters\GuzzleAdapter;
use dsolodev\Cloudflare\Http\Auth\BearerAuth;
use dsolodev\Cloudflare\Services\CloudflareService;

$auth = new BearerAuth('your-token', 'your-email@example.com');
$adapter = new GuzzleAdapter($auth, 'https://api.cloudflare.com/client/v4/');

$service = new CloudflareService(
    email: 'your-email@example.com',
    token: 'your-token',
    client: $adapter
);

$zones = $service->get('zones');
```

### Custom Headers

[](#custom-headers)

```
use dsolodev\Cloudflare\Facades\Cloudflare;

$adapter = app(CloudflareService::class)->getDebug();
// Note: Direct header manipulation requires accessing the underlying adapter
```

Development
-----------

[](#development)

### Code Quality

[](#code-quality)

```
# Run linter
composer lint

# Check code style
composer test:lint

# Run static analysis
composer test:types

# Run refactoring checks
composer test:refactor

# Run all tests
composer test
```

### Tools Used

[](#tools-used)

- **Laravel Pint** - Code style formatting
- **PHPStan** - Static analysis (Level 9)
- **Rector** - Automated refactoring

API Documentation
-----------------

[](#api-documentation)

For complete Cloudflare API documentation, visit:

License
-------

[](#license)

This package is open-sourced software licensed under the [MIT license](LICENSE).

Credits
-------

[](#credits)

- **Author**: JC ()
- **Package**: dsolodev/laraflare

Support
-------

[](#support)

For issues, questions, or contributions, please visit the GitHub repository.

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance63

Regular maintenance activity

Popularity1

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

222d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/7b87370ad1deda3d582cc1ecd0f073ca849a1966d4de7d80443dcb2d048e4b65?d=identicon)[dsolodev](/maintainers/dsolodev)

---

Top Contributors

[![dsolodev](https://avatars.githubusercontent.com/u/43586834?v=4)](https://github.com/dsolodev "dsolodev (7 commits)")

---

Tags

apilaravelsdkcloudflarev4

###  Code Quality

Static AnalysisPHPStan, Rector

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/dsolodev-laraflare/health.svg)

```
[![Health](https://phpackages.com/badges/dsolodev-laraflare/health.svg)](https://phpackages.com/packages/dsolodev-laraflare)
```

###  Alternatives

[saloonphp/saloon

Build beautiful API integrations and SDKs with Saloon

2.4k9.6M468](/packages/saloonphp-saloon)[hubspot/api-client

Hubspot API client

23414.2M16](/packages/hubspot-api-client)[smodav/mpesa

M-Pesa API implementation

16363.7k1](/packages/smodav-mpesa)[sebdesign/artisan-cloudflare

Laravel artisan commands for Cloudflare

77273.8k](/packages/sebdesign-artisan-cloudflare)[mozex/anthropic-laravel

Anthropic PHP for Laravel is a supercharged PHP API client that allows you to interact with the Anthropic API

71226.4k1](/packages/mozex-anthropic-laravel)[bushlanov-dev/max-bot-api-client-php

Max Bot API Client library

281.6k](/packages/bushlanov-dev-max-bot-api-client-php)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
