itul/functions
itul/functions is a Laravel/PHP utility package that bundles a collection of handy global helper functions, simplifying common development tasks and cutting boilerplate so you can write cleaner, more expressive application code.
Architecture fit
itul/functions is a global-helper package — a flat library of procedural functions that PHP's standard library omits. In a Laravel codebase this occupies the same namespace-free space as Illuminate\Support helpers (str(), blank(), data_get()), the Arr/Str facades, and Composer polyfills such as symfony/polyfill-php80. Architecturally it is a leaf dependency: it introduces no service provider contract stated in the metadata, no config surface, and no extension points. That makes it trivially droppable into a project and trivially orphaned later, but it also means it cannot be scoped, versioned per-module, or substituted without a global find-and-replace. For a Laravel TPM this reads as a convenience shim, not a platform component — suitable for a bounded internal utility layer, unsuitable as a foundational dependency of shared packages.
Integration feasibility
Mechanically easy, procedurally awkward. Because the source is Bitbucket rather than Packagist (no Packagist attribution is evidenced), consumption requires a vcs repository entry in composer.json plus an explicit constraint, which bypasses the normal Packagist supply-chain path: no download stats, no automated security advisories, no composer outdated signal, no signed releases. Every consuming app must also carry Bitbucket credentials or an app password in CI, which is a secrets-management and onboarding cost that scales with the number of repositories.
Technical risk
function_exists() guards and a stable naming convention, coexistence with symfony/polyfill-* is a hard runtime failure, not a soft one.str_contains, str_starts_with, array_is_list, array_find/array_any in 8.4). Functions that shadow native behaviour become future deprecation debt.Key questions
composer.json, and is that constraint enforced in CI?function_exists() and a documented prefix, and is there a written non-collision policy?dev-main the only ref? Can we pin an immutable commit?Illuminate\Support? What is the unique residual set?Stack fit
The package fits Laravel only as an application-level convenience, not as a shared-library dependency. The defensible pattern is to vendor it behind an internal App\Support façade or a small first-party itul-bridge composer package that re-exports only the functions we have audited. That converts an unowned global surface into an owned, testable one and makes the eventual replacement a single-package change rather than a codebase sweep.
Migration path
function_exists() and, where feasible, move it into a namespaced class with static methods to eliminate global collisions entirely.Compatibility Targeting the oldest PHP/Laravel pair in the fleet is the binding constraint. Because the helpers are procedural, they carry no framework version coupling — a benefit — but that also means Laravel will not surface upgrade conflicts for us; we must run the audit ourselves at each PHP minor bump. Establish a matrix test (PHP 8.1–8.4 × Laravel 10/11/12) in the fork's CI before any tag.
Sequencing Audit and fork first (low cost, high information); bridge packaging second; adoption third, and only for teams that have a concrete function they need today. Do not front-run this as a standardisation initiative — the opportunity score of 35.12 and absent adoption signal argue for a pull-based rollout, not a mandated one. Re-evaluate the fork annually against the PHP changelog and retire functions as natives land.
Maintenance We inherit the maintenance burden, not the maintainer. Upstream activity is unobservable through Packagist telemetry, so the fork is the real product: it needs an owner, a README, a changelog, and a documented divergence policy. Budget on the order of a few engineer-days initially and a recurring half-day per PHP minor release to re-run the native-equivalence audit.
Support
No vendor, no SLA, no community to escalate to. Internal support falls to whoever owns the fork. Onboarding new engineers requires explaining why a non-standard helper set exists — a documentation cost that a Illuminate\Support-only policy avoids entirely. If the unique function set is small, the honest support answer may be "we reimplemented two functions and deleted the package."
Scaling Negligible runtime cost: procedural wrappers are autoloaded once and are O(1) dispatch. The scaling risk is organisational rather than computational — every additional consuming repository multiplies the Bitbucket credential surface and the number of places a breaking upstream change must be absorbed. Prefer a single bridge package to keep the blast radius at one.
Failure modes
Ramp-up Low skill barrier (any PHP developer can read and vendor these functions) but a non-obvious governance barrier: engineers must know not to add new functions to the fork without the audit step, and must know the retirement path for a helper once PHP ships a native equivalent. Plan a short internal note — inventory table, approved subset, deprecation cadence — rather than training. If the audit shows the additive surface is one or two functions, recommend reimplementation in first-party code and skip the dependency entirely; that is the lowest-operational-cost outcome and, given the evidence available, the most likely one.
How can I help you explore Laravel packages today?