Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Ideal Bundle Laravel Package

shivella/ideal-bundle

Shivella iDEAL Bundle adds iDEAL payments to Symfony applications, with payment initiation, provider configuration, and status handling for PHP checkout flows. A lightweight way to support Dutch bank payments.

View on GitHub
Deep Wiki
Context7

Getting Started

The package has been deprecated since 1.0.6, published 2018-09-18. That date is the most important fact in this assessment. This is not a fresh deprecation notice you caught early — it is a package that has been marked dead for roughly seven years and, on the evidence of the release history, has had no release since. Treat it as abandoned until Packagist proves otherwise.

Minimal steps before you write any code:

  1. Confirm the lifecycle state. Run composer show <vendor>/<package> and read the abandoned flag. Composer surfaces this directly. Given a 2018 deprecation with no subsequent tag, expect it to be set — and expect the suggested replacement, if any, to be named there. That flag is more authoritative than the changelog line.
  2. If you are not yet using it: do not start. The first use case here is evaluation for replacement, not adoption. A seven-year-old dependency has no security response process, no PHP 8.x compatibility work, and no path to the current Laravel major. Find the maintained alternative before writing a single call site.
  3. If you are already using it: scope the blast radius and the risk surface simultaneously. Grep for the facade alias, the service provider registration, published config/migration/asset tags, and any Blade directives or global helpers it registers. The call-site count is your migration estimate; the runtime surface (does it touch the DB, the filesystem, queues, HTTP, serialisation?) is your risk estimate. A dormant package in a cold code path is a scheduling problem. A dormant package on your request hot path or in your auth flow is a different conversation.
  4. Where to look first in the repo: composer.json for the illuminate/* constraints (these will tell you which Laravel era the package was written for and how far behind it is), the service provider's register()/boot(), the README banner for a replacement pointer, and a diff of 1.0.6 against 1.0.5.

The realistic first task is a containment spike, not a feature: pick your single most-used integration point, wrap it behind an interface, and ship that. It gives you the template, the migration estimate, and a concrete ticket to point at.

Implementation Patterns

Day-to-day patterns for a package in this state are containment patterns. You are no longer optimising for leverage; you are optimising for cheap removal and bounded blast radius.

Adapter / anti-corruption layer. Never call the package from controllers, jobs, models, or Blade templates. Define an interface in your domain (Contracts\X) and a concrete implementation that delegates to the package. One file changes when you migrate; every call site stays put. This is the highest-value hour you will spend on this package, and it is more urgent here than for a freshly deprecated one because you cannot rely on upstream ever fixing a bug your adapter would have to work around.

Pin the constraint, and pin it hard. Use "vendor/package": "1.0.*". Do not use ^1.0 and do not float it — the caret is meaningless on a package with no releases since 2018, but the habit matters for the transitive graph. Note that a seven-year dormancy also means "a final security patch" is not a realistic hope; the pin is now about reproducibility, not about absorbing a future patch.

Freeze the surface area. Declare a code freeze on new call sites. Any new requirement goes through the adapter, which reframes the work as "the adapter needs method X" — a question you answer once during migration rather than per-feature. This is what stops the dependency quietly growing while the migration ticket sits in the backlog.

Strangler migration, sequenced around your Laravel upgrade. Stand up the replacement behind the same interface, gate it with a config flag, and cut over per environment. If a Laravel major upgrade is anywhere on your roadmap, the replacement goes first — a package last touched in 2018 will pin you to an old illuminate/support constraint and block composer update at the worst possible moment. Doing both under upgrade pressure is how these migrations get done badly.

PHP runtime compatibility is now a live concern, not a theoretical one. Code written in 2018 predates PHP 8.0/8.1. Expect dynamic-property deprecations, implicit nullable-parameter deprecations, and possibly harder breaks around string/array function signatures. If you are already on PHP 8.2+, the package may be emitting noise or failing on edge paths. Budget for this in the containment spike — you may need a local patch or a compatibility shim before the migration completes.

Fork or vendor if you are staying. For a small surface, copying the source into app/Support/ with the licence header intact is often cheaper than carrying a dead dependency through several PHP and Laravel majors — and unlike a freshly deprecated package, you are not racing upstream improvements, so a fork costs you nothing in lost updates. Check the licence first: permissive means this is legitimate, restrictive means it is not.

Container binding over facade. Bind the adapter in a service provider and inject it. This keeps Facade::shouldReceive out of your test suite and makes the implementation swappable without touching tests.

Gotchas and Tips

  • Deprecated ≠ broken, and seven years of quiet is not seven years of incidents. 1.0.6 almost certainly still works exactly as it did in 2018. The risk is the absence of future security patches and framework compatibility, not a runtime regression. Frame this as scheduled tech debt with an owner and a removal date — not as an outage, or you will get panic instead of a ticket.
  • Composer will not fail your build. Nothing in a normal composer install stops on an abandoned package. Add a CI step that greps composer show output, or a small denylist script that fails the build on known-dead packages. Without enforcement, this deprecation has already survived seven years of ticket closures and will survive another.
  • The 1.0.6 diff is almost certainly metadata-only. The release notes are the single line "marked as Deprecated". That strongly implies a README banner plus a composer.json change — possibly the abandoned key itself, possibly just the description. Diff it against 1.0.5 before assuming behaviour changed. If it is metadata-only, you can update the lock file with confidence and you have learned nothing new about the code. Note this also means there is no test signal here: a docs-only release tells you the maintainer's intent, not that anything was audited or fixed.
  • Seven years of no releases means the security posture is unknown, not clean. There is no CVE feed to check, because nobody is maintaining one for this package. If the package touches deserialisation, file uploads, SQL, or authentication, treat it as unpatched by default and prioritise it accordingly.
  • Check whether it is a transitive dependency first. Run composer why <vendor>/<package>. If something else pulled it in, the maintainer of that package owns the fix — open the conversation upstream rather than forking something you did not choose. Your own migration ticket cannot close until they move.
  • PHP E_DEPRECATED notices are a separate problem. Notices surfacing from the package's internals on PHP 8.x are a bug you can patch locally; the package's own deprecation status is an end-of-life decision. Given the 2018 vintage you will likely see both in the same log file. Read the message, not the word.
  • Extension points are still your escape hatch. Service provider bindings, config files, and published migrations are override surfaces. Inspect register() for $this->app->bind/singleton calls — if you can re-bind one class, you may be able to replace the internals without touching any call site, which turns a multi-sprint migration into an afternoon.
  • Document the exit. Add an ADR or a short README note: why it is still here, what replaces it, who owns the removal, and the target date. A deprecation that lives only in a 2018 changelog lives forever — this one already has.
  • Confirm against the repo before planning work. The release metadata gives you the tag, date, and note text, but not the diff, the licence terms, or the actual replacement candidate. Verify those three things against the package itself before you commit to a plan.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console