kitano/pel-bundle
A Symfony bundle that integrates the PHP Exif Library (PEL), giving your application a service-based way to read, edit, and write EXIF metadata in JPEG and TIFF images through familiar dependency injection and configuration.
Architecture fit — This is not a Laravel package; it is a Symfony bundle. KitanoPelBundle is a Bundle subclass with a DI extension and a kitano_pel configuration tree, loaded through Symfony's kernel. Laravel has no concept of bundles, no AppKernel, and its service container does not honor Symfony's Extension::load() / compiler-pass lifecycle. Nothing in this repository is dropped into a Laravel app without rewriting the glue.
Integration feasibility — Three options, in descending order of cost:
symfony/expression-language directly. It is a standalone component with no framework coupling, works in Laravel unchanged, and is the direct successor to PEL. This is a 1–2 hour task.Technical risk — High, on multiple axes:
Key questions for the requester
Stack fit — Target Laravel 9/10/11 on PHP 8.1+. symfony/expression-language is a framework-agnostic Composer dependency that installs cleanly alongside Laravel; its transitive footprint is small (Contracts, Cache for parsed-expression caching). Syntax is PEL-compatible in practice — literals, operators, and/or/not, ternary, in/not in, matches, array/attribute access, and function calls all carry over. API surface differs modestly: ExpressionLanguage::evaluate($expr, array $values) and ->compile($expr) versus PEL's compiled-expression objects.
Migration path (only if PEL expressions already exist in production)
symfony/expression-language; register an ExpressionFunctionProviderInterface implementation per domain (e.g., pricing, eligibility) rather than one global function bag.ExpressionFunction instances; the compiler callback is required if you intend to compile.PricingExpression adapter in app/Support/ that translates and delegates — do not fork the bundle.Compatibility — Bind the evaluator as a singleton in a service provider; inject it by constructor or interface (ExpressionEvaluator) so it stays swappable and mockable in tests. Do not expose a Facade — it invites static calls into what should be an injected policy boundary. Pin the component major/minor in composer.json and let Dependabot track it.
Sequencing
composer.json (1 week elapsed, mostly observation).Total: roughly one engineer-week, versus days-to-weeks of archaeology plus permanent ownership if the bundle is adopted.
Maintenance — Adopting the bundle transfers upstream maintenance to your team permanently: PHP 8 compatibility, Composer constraint drift, and any security issue in a dependency with no release cadence. The Symfony component is maintained by the Symfony core team with a published LTS and security-advisory process. On a 0.02-score package, the fork cost is not hypothetical — it is the default outcome.
Support — No vendor, no SLA, effectively no community. Debugging lands on whoever is on call. The Symfony component has first-party documentation, a large Stack Overflow corpus, and staffable expertise in the market.
Scaling — Expression parsing dominates cost, not evaluation. Compile once and cache the compiled form (storage/framework/cache, keyed by hash of the expression plus a provider-version salt so function changes invalidate cleanly). Compilation turns evaluation into cheap PHP; without it, you pay a lexer/parser pass on every request. Memory is negligible; the real scaling constraint is CPU under high-cardinality expression sets, which caching resolves.
Failure modes to instrument
SyntaxError on malformed input — catch and map to a 422/validation error, never a 500. Log the expression text (truncated) and the author.\Error/\TypeError from accessing absent array keys or properties — normalize the value bag defensively or require ??-style guards in expressions.Ramp-up — With the Symfony component: half a day for a mid-level Laravel engineer to be productive, one day to be fluent in compile/cache and custom function registration. With the bundle: days of reading Symfony DI conventions that have no analogue in the target stack, followed by indefinite ownership. Team familiarity with Symfony's container is a prerequisite the bundle silently assumes.
Recommendation — Reject kitano/pel-bundle. It is a Symfony-only glue layer around a superseded expression library, with abandoned-package risk signals (4 stars, 0 dependents, 0.02 score) that no amount of internal effort fixes. Adopt symfony/expression-language directly behind an injected interface, port only the custom functions you actually use, and compile-and-cache from day one.
How can I help you explore Laravel packages today?