swp/updater-bundle
A Symfony bundle for managing application updates: organize sequential update routines, run them from a command or admin interface, and track which updates have already been applied so deployments stay predictable.
Before anything else: this is a Symfony bundle from the Superdesk Web Publisher lineage, not a Laravel package, and the repository is archived. You cannot composer require it into a Laravel app and get a working updater — there is no service provider, no auto-discovery, no config/updater.php, and no Artisan command. Treat it as reference source code for the underlying ahilles107/updater library, and port the pattern rather than the package.
If you are genuinely on a legacy Symfony app and want to run it directly:
composer require swp/updater-bundleSWP\UpdaterBundle\SWPUpdaterBundle in config/bundles.php (or AppKernel.php on Symfony 2/3).DependencyInjection/Configuration.php to discover the actual config keys — documentation is thin.bin/console list to find the updater command, then run it with -vvv.Where to look first (all Symfony side): src/Command/ for the CLI entry point, Resources/config/services.yml for how the updater service is wired, and vendor/ahilles107/updater/src/ for the actual download → extract → replace logic. The underlying library is small — reading it end to end takes less time than reverse-engineering the bundle wiring, and it is the only part with transferable value to a Laravel app.
First Laravel use case you would actually build: an admin-triggered "check for updates and apply" flow. A small UpdateApplication Artisan command hits a static JSON manifest (version, url, sha256, optional channel), downloads the archive with Http::get(), verifies the checksum, extracts into releases/<version>/, runs artisan migrate --force and optimize:clear, then flips a current symlink. The bundle gives you the shape of that flow; you write the Laravel-native implementation.
php artisan app:update.version, url, sha256, channel, php/laravel constraints. Keep version resolution in the manifest; the updater's only job is fetch → verify → extract → swap. This mirrors what the bundle does and is far easier to test.$this->call('down'), a backup step (Spatie backup or a DB dump), the file swap, migrate --force, optimize:clear, queue:restart, opcache reset, then $this->call('up').releases/<version>/, run migrations against the new release, then flip a current symlink. Rollback is a symlink flip back plus a DB rollback. This is the single pattern most worth copying from the package's design, and it fits Laravel's Storage/File facades cleanly.ahilles107/updater is tiny — a handful of classes for download, unzip, copy. Vendoring that logic into an internal App\Services\Updater behind an interface (with your own signing/checksum verification) is cleaner than reproducing Symfony DI wiring for an unmaintained dependency.config/updater.php with manifest_url, channel, backup_path, allow_prerelease, releases_path, current_symlink, verify_signature, timeout. Bind it to a service provider and register the Artisan command — the equivalent of the bundle's service definition and command registration, but idiomatic Laravel.services.yml to inject authenticated downloaders, custom logging, or post-extract hooks. In the Laravel port, these become driver bindings (e.g., a Downloader contract with Http, S3, or Local implementations) and events (UpdateDownloaded, UpdateApplied, UpdateFailed) for post-extract hooks.releases/ and current; the PHP-FPM user should never be able to write to application code. This is the operational pattern the package assumes and the one you must preserve.config:cache, no queue restarts, no opcache reset. All schema changes, compiled-view clears, and worker restarts are your responsibility to sequence after the extract.-vvv (Symfony) or --verbose (Artisan port), tail storage/logs/laravel.log, and first confirm the manifest URL is reachable from the server — proxies, TLS certs, and redirects are frequent culprits. The two most common real failures are a 404 on the manifest and an unwritable target directory.../ in zip entries — validate and reject), symlink handling during extraction, and rollback before writing the first line. The package has had no such review; you cannot inherit safety from it.Cache::lock()), and only run on one instance at a time, or every node will try to extract concurrently.ahilles107/updater is small, vendoring the two or three classes you need into a Laravel service — with your own manifest format, signature checks, atomic swap, and rollback — is almost always cleaner than dragging an unmaintained Symfony bundle into a Laravel codebase it was never designed to fit.How can I help you explore Laravel packages today?