devhelp/piwik-api
Laravel package to integrate with the Piwik/Matomo API. Provides a simple PHP client wrapper and configuration to query analytics data (sites, visits, events, reports) from your application without dealing with low-level HTTP calls.
Installation
composer require devhelp/piwik-api
Basic Initialization
use Devhelp\PiwikApi\Piwik;
$piwik = new Piwik([
'url' => 'https://your-piwik-instance.com',
'auth_token' => 'your_auth_token_here',
'site_id' => 1, // Default site ID
]);
First Use Case: Fetch Visits
$visits = $piwik->getVisits();
print_r($visits);
src/Piwik.php – Core class with all API methods.src/Exceptions/ – Custom exceptions for error handling.config/piwik.php (if auto-generated) – Configuration options.Use runtime arguments for flexibility:
$period = 'day';
$date = '2023-10-01';
$metrics = $piwik->getMetric('nb_visits', [
'period' => $period,
'date' => $date,
]);
Fetch multiple metrics in one call:
$metrics = $piwik->getMetrics(['nb_visits', 'bounce_count'], [
'period' => 'week',
]);
auth_token in constructor.login() method for temporary tokens:
$piwik->login('username', 'password');
Piwik to the container:
$this->app->singleton(Piwik::class, function ($app) {
return new Piwik(config('piwik.settings'));
});
// PiwikFacade.php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class PiwikFacade extends Facade {
protected static function getFacadeAccessor() { return 'piwik'; }
}
Usage:
$visits = \App\Facades\Piwik::getVisits();
Cache API responses to reduce calls:
$cacheKey = "piwik_visits_{$date}";
$visits = Cache::remember($cacheKey, now()->addHours(1), function () use ($piwik, $date) {
return $piwik->getVisits(['date' => $date]);
});
Authentication Failures
auth_token or login credentials are correct.try {
$piwik->getVisits();
} catch (\Devhelp\PiwikApi\Exceptions\AuthException $e) {
Log::error('Piwik Auth Error: ' . $e->getMessage());
}
Rate Limiting
use Symfony\Component\HttpClient\RetryableHttpClient;
$client = new RetryableHttpClient($piwik->getHttpClient(), [
'max_retries' => 3,
'delay_factor' => 2,
]);
Date/Period Formatting
YYYY-MM-DD for date, day/week/month for period).if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) {
throw new \InvalidArgumentException('Invalid date format');
}
Site ID Mismatch
site_id is omitted or invalid, API calls may return empty data or errors.site_id exists in Piwik’s Sites Manager.Logging Enable debug logging for API responses:
$piwik->setDebug(true); // Logs raw API responses to storage/logs/piwik.log
Extending the Package
Piwik class:
class ExtendedPiwik extends \Devhelp\PiwikApi\Piwik {
public function getCustomMetric($metricId, $params = []) {
return $this->callApi('getMetric', [$metricId], $params);
}
}
$piwik->setHttpClient(new \GuzzleHttp\Client([
'headers' => ['User-Agent' => 'MyApp/1.0'],
'proxy' => 'http://proxy.example.com',
]));
Testing
Piwik class in PHPUnit:
$mock = $this->createMock(\Devhelp\PiwikApi\Piwik::class);
$mock->method('getVisits')->willReturn(['nb_visits' => 100]);
Configuration
auth_token) in Laravel’s .env:
PIWIK_URL=https://your-piwik-instance.com
PIWIK_AUTH_TOKEN=your_token_here
PIWIK_SITE_ID=1
config/piwik.php:
return [
'settings' => [
'url' => env('PIWIK_URL'),
'auth_token' => env('PIWIK_AUTH_TOKEN'),
'site_id' => env('PIWIK_SITE_ID', 1),
],
];
Error Handling
try {
$data = $piwik->getVisits();
} catch (\Devhelp\PiwikApi\Exceptions\ApiException $e) {
// Handle API errors (e.g., invalid parameters)
abort(500, 'Piwik API Error: ' . $e->getMessage());
} catch (\Devhelp\PiwikApi\Exceptions\NetworkException $e) {
// Handle network issues
abort(503, 'Piwik Service Unavailable');
}
Performance
dispatch(new FetchPiwikData($piwik, $params))->onQueue('piwik');
How can I help you explore Laravel packages today?