Installation
composer require zenichanin/freshdesk-laravel
Publish Configuration
php artisan vendor:publish --provider="Zenichanin\Freshdesk\FreshdeskServiceProvider"
This generates a freshdesk.php config file in config/.
Configure .env
Add Freshdesk credentials:
FRESHDESK_DOMAIN=yourdomain.freshdesk.com
FRESHDESK_API_KEY=your_api_key_here
Register Service Provider
Ensure Zenichanin\Freshdesk\FreshdeskServiceProvider::class is in config/app.php under providers.
First Use Case: Create a Ticket
use Zenichanin\Freshdesk\Facades\Freshdesk;
$ticket = Freshdesk::ticket()->create([
'subject' => 'Test Ticket',
'description' => 'This is a test ticket from Laravel.',
'priority' => 2,
]);
Create a Ticket
Freshdesk::ticket()->create(['subject' => 'Issue', 'description' => 'Details...']);
Fetch a Ticket
$ticket = Freshdesk::ticket()->find(123);
Update a Ticket
Freshdesk::ticket()->update(123, ['status' => 2]);
List Tickets
$tickets = Freshdesk::ticket()->all(['page' => 1, 'per_page' => 10]);
Create a Contact
Freshdesk::contact()->create(['name' => 'John Doe', 'email' => 'john@example.com']);
Fetch a Contact
$contact = Freshdesk::contact()->findByEmail('john@example.com');
Use Laravel's queue system to defer Freshdesk operations:
use Zenichanin\Freshdesk\Jobs\CreateTicket;
CreateTicket::dispatch(['subject' => 'Async Ticket', 'description' => 'Processed later...']);
Wrap Freshdesk calls in middleware for logging/retries:
// app/Http/Middleware/FreshdeskLogger.php
public function handle($request, Closure $next) {
$response = $next($request);
\Log::info('Freshdesk API Response:', ['status' => $response->status()]);
return $response;
}
Listen to Laravel events (e.g., order.created) and trigger Freshdesk tickets:
Event::listen('order.created', function ($order) {
Freshdesk::ticket()->create([
'subject' => 'New Order #' . $order->id,
'description' => 'Order details: ' . $order->details,
]);
});
API Rate Limits
$cacheKey = 'freshdesk_tickets_' . $page;
return Cache::remember($cacheKey, now()->addMinutes(5), function () use ($page) {
return Freshdesk::ticket()->all(['page' => $page]);
});
Domain vs. Subdomain
FRESHDESK_DOMAIN matches your Freshdesk instance (e.g., company.freshdesk.com, not freshdesk.com/company).API Key Permissions
Error Handling
Zenichanin\Freshdesk\Exceptions\FreshdeskException. Catch and log:
try {
Freshdesk::ticket()->create([...]);
} catch (\Exception $e) {
\Log::error('Freshdesk Error:', ['message' => $e->getMessage()]);
abort(500, 'Failed to create ticket.');
}
Pagination Quirks
all() returns a Collection but may paginate results. Always check ->total() for counts.Enable API Logging
Add to config/freshdesk.php:
'debug' => env('FRESHDESK_DEBUG', false),
Logs requests/responses to storage/logs/freshdesk.log.
Test with Postman Validate API keys and endpoints manually before integrating:
GET https://{domain}.freshdesk.com/api/v2/tickets
Headers: X-Api-Key: {your_key}
Custom Endpoints Extend the client for unsupported endpoints:
// app/Services/FreshdeskClient.php
use Zenichanin\Freshdesk\Client;
class CustomFreshdeskClient extends Client {
public function customEndpoint($data) {
return $this->request('POST', '/api/v2/custom_endpoint', $data);
}
}
Override Config
Bind the client in AppServiceProvider:
$this->app->bind('freshdesk.client', function ($app) {
return new CustomFreshdeskClient(config('freshdesk'));
});
Webhook Listeners
Use Laravel's HandleIncomingWebhook to process Freshdesk webhooks:
// routes/web.php
Route::post('/freshdesk/webhook', [FreshdeskWebhookController::class, 'handle']);
How can I help you explore Laravel packages today?