philetaylor/akeeba
Laravel/PHP package for Akeeba Backup integration. It provides convenient tools for working with Akeeba-generated backup archives, including inspecting, extracting, and managing .jpa files directly from your application.
config/akeeba.php. Laravel will not "just load" it. Expect to spend your first hour reading vendor/philetaylor/akeeba/ — specifically the DependencyInjection/ folder (to learn config keys) and the Service/ or Api/ class (the actual client you want).composer require philetaylor/akeeba.$this->app->singleton(AkeebaClient::class, fn () => new AkeebaClient(
config('services.akeeba.url'),
config('services.akeeba.key'),
));
config/services.php + .env (AKEBBA_URL, AKEBBA_KEY). The key is a query-string secret, not a header — treat it like a password.Backup with createdAt, size, status). This validates connectivity and response shape before you attempt anything destructive.App\Services\AkeebaService — that owns the client. Controllers, jobs, and commands never touch the vendor class. This is your seam for mocking, retries, and eventually replacing the bundle with five raw Guzzle calls.php artisan make:job TriggerAkeebaBackup), never in a synchronous web request.CheckAkeebaBackupStatus job re-dispatches itself with delay until the API reports complete. This pairs naturally with Laravel's scheduler for weekly triggers.Storage::put($path, $stream)). Do not buffer a multi-hundred-MB archive into memory.[url, key] pairs, resolve a fresh client per entry, and iterate. The client is cheap to construct.interface BackupProvider { public function history(): array; public function trigger(): string; } and implement it with this bundle. When the bundle rots (see below), you swap the implementation and nothing else changes.composer.json, and be ready to fork. Seriously evaluate whether ~5 Guzzle calls against the Akeeba JSON API is a better investment than integrating a Symfony bundle into Laravel.Extension/CompilerPass semantics Laravel doesn't have. Manual instantiation of the client class is the pragmatic path.Log::info($url) or exception traces will expose it. Sanitize URLs before logging and set 'debug' => false on the HTTP client in production.{ "error": ... } payloads. Parse the body; never trust the status code alone.timeout and a separate connect_timeout.verify => false for non-prod only.AkeebaService boundary and keep recorded JSON responses as fixtures so you notice when the API shape shifts.How can I help you explore Laravel packages today?