ijanki/ftp-bundle
ijanki/ftp-bundle offers a lightweight FTP integration for Laravel/PHP applications, making it easy to connect to remote servers and perform common file operations. Configure your connection once, then upload, download, list, and manage files through a clean, simple API.
ftp_* extension (connect, login, passive mode, upload/download, directory listing, chmod, delete). If a roadmap item is "let admins push/pull files to a partner's FTP server," the method list still gives a usable floor for sizing an in-house implementation — roughly a dozen methods.ftp_connect change — it returns an FTP\Connection instance instead of a resource. Any consumer, ours included, now has to reason about runtime PHP version when handling connection objects: resource on ≤8.0, FTP\Connection on 8.1+. That is a breaking type change inherited from the platform, not an improvement to the API, and it is exactly the kind of thing a wrapper is supposed to insulate callers from. Budget for it in any plan that touches ftp_* directly.Bundle suffix, service container config, no service provider, no facade, no config publishing. For a Laravel codebase, adopting it means importing a foreign framework's composition conventions into an app that doesn't use them. Open diligence item: v4.0.0 may have revised framework or PHP requirements; the notes don't say. Confirm before repeating the "legacy Symfony2" characterization to anyone who has read the release. Either way, the Laravel fit answer does not change.Consider it only under narrow conditions:
FTP\Connection vs. resource split is a non-issue.Look elsewhere — or build — when any of the following is true:
Storage::disk() with the ftp or sftp driver from league/flysystem. It ships natively, is tested, already in the dependency graph, and already absorbs the PHP 8.1 connection-type change for you. There is no reason to add a Symfony bundle to a Laravel app.FTP\Connection handling, the wrapper's behavior is now tied to your runtime. If you run 8.0 and 8.1+ fleets, or are mid-upgrade, you inherit a compatibility matrix you didn't ask for.ftp_* extension does not do SFTP at all and needs explicit ftp_ssl_connect for FTPS. Most partners require SFTP; this is the wrong primitive.ftp_* functions with no injectable transport. Unit-testing callers means a live server or namespace-shadowing tricks — a real CI cost, and v4.0.0 did nothing to make the transport fakeable.For executives — one line: A new major version of the FTP library was published, but it only adjusts the library to a change in the underlying PHP language; it adds no capability, no reliability features, and no security fixes. Our recommendation is unchanged: do not adopt — the capability is already standard in our stack and we can meet the requirement without a new dependency.
For engineering — the substance:
ftp_connect now returns an FTP\Connection instance where it used to return a resource. That is a platform change the package is reacting to, not a package feature. Read the notes carefully: they explain PHP, not the library, which is itself a documentation-quality tell.ftp_* work we do now has a type-handling fork (resource on ≤8.0, FTP\Connection on 8.1+). Our in-house adapter should normalise that behind our own interface so callers never see it. This is a half-day of care, not a reason to take on the dependency.FileTransfer port, backed by Flysystem's FTP/SFTP adapters, or a direct ftp_ssl_connect wrapper if we truly need raw FTP. Keep the port narrow enough to hide connection-type differences across PHP versions so the transport stays swappable. If a partner forces plain FTP, it ships in the same sprint and we own the retry and error semantics.Ask: no budget, no dependency — sign-off on one engineer-day for the first-party adapter (plus a small allowance for PHP 8.1 connection-type handling), and a note that plain FTP is a compatibility fallback, not a default, in any partner-integration standards we publish.
How can I help you explore Laravel packages today?