You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Developer Feature Request] Add injection point to CoreExtension::getAttribute for getting attributes from custom objects #4491
if (/* Template::METHOD_CALL */'method' !== $type) {
Makes most of my problems go away.
Firstly, yes, I'm using Twig with Laravel (via https://github.com/rcrowe/TwigBridge). As you might know, Laravel is riddled with magic. Models have both __get and __call methods. Some methods look like this:
Which represents a database relationship. So when I try {{ booking.customer }} in Twig (which used to work in old versions), Twig will first try looking for a $customer property on my Booking, won't find that, then implicitly tries __get, which might work but if it comes back null (per the referenced issue), it'll then try calling it instead which returns a BelongsTo object. Now any {% if booking.customer %} checks are broken because BelongsTo is truthy. What I really wanted is for Twig to evaluate that relationship, the same way Laravel does it when I call it like $booking->customer (no parens) in PHP.
Now there's no reason for Twig to provide tight coupling/integration with Laravel, so I propose some way for developers to override how getAttribute works. Maybe via a Twig extension, or some configuration option, something that would let me inject that little snippet of code to handle Laravel models properly.
As an alternative, I'm realizing now that adding this to the end of that same block:
if (method_exists($object, '__get')) {
if ($isDefinedTest) {
returnfalse;
}
returnnull;
}
Also seems to work. It prevents the method call fallback and allows getters to properly return null. This is probably a backwards-incompatible change, so an option to enable "prevent method call fallback when __get is defined" might work and be simpler.
Activity
ericmorand commentedon Dec 1, 2024
Maybe the issue is that Laravel is plagued with magic.
shyim commentedon Dec 11, 2024
We do this uggly hack that works for us pretty okayyish.
https://github.com/shopware/shopware/blob/trunk/src/Core/Framework/Adapter/Twig/TwigEnvironment.php#L38-L45
ju1ius commentedon Jan 29, 2025
...would also be welcome in legacy applications where the conventions look like
$foo->get_bar().mnpenner commentedon Oct 26, 2025
I managed to work around this on Laravel's side by making all my models extend this:
A bit of a hack, but it allowed me to unfork Twig.
Seems to be working so far anyway. I still have a million other errors from upgrading everything.