1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Fixed Callbacks cannot be a magic method

Discussion in 'Resolved Bug Reports' started by JoshyPHP, Jul 22, 2014.

  1. JoshyPHP

    JoshyPHP Well-Known Member

    XenForo rejects Foo::bar as a callback if there is no public, static method bar() in the class Foo even if there is a public, static __callStatic() method in Foo. My guess is that XenForo tests the existence of the method via method_exists() an equivalent function.

    I propose that XenForo tests the validity of callbacks with is_callable() first and if it disagrees with method_exists(), test whether __callStatic() exists.

    __callStatic() was introduced in PHP 5.3.
  2. Liam W

    Liam W Well-Known Member

    Actually, XF (since 1.2 or 1.3) uses PHP reflection to check for methods and classes.

    Line 70, library/Helper/Php.php
  3. Mike

    Mike XenForo Developer Staff Member

    Can you give a use case for __callStatic in the context of XF's various callback options? I'm not sure I'm seeing a clear benefit.
  4. JoshyPHP

    JoshyPHP Well-Known Member

    My use case is both complicated and not terribly relevant so feel free to skip this paragraph. I'm trying to implement a way for end users to customize media sites on top of what my add-on does without too much extra configuration on their part, and one of the way I envisaged was to use the media site's name in the callback. There are 68 media sites in my add-on and I didn't want to create 68 methods ahead of time, most of which would never actually be run and all of which would only serve as a redirector to the real method. So I thought I'd cut the middle man and implement the "real" method as __callStatic() and let PHP's magic do its thing. Unfortunately for me, XenForo had other plans.

    But that's a terrible use case. The reason I reported this behaviour as a bug is because even though the callback is valid, XenForo rejects it. It broke my expectation that a valid callback would be accepted, and I think it would deserve to be changed. However, as far as I'm concerned, magic callbacks are not a priority because I don't actually want to use them...

    ...which brings me back to my use case and the feature request I didn't have time to file earlier. I thought I'd file it separately but since I'm already discussing it here it is. The admin panel describes the signature of the "Embed HTML Callback" as the following:
    public static function myCallback($mediaKey, array $site)
    I had expected that $site would contain more information about the media site but all it contains is the HTML code and the callback itself. If you want to fix my use case then please add the media site's id (media_site_id) to $site so that the callback knows which site called it.
  5. Mike

    Mike XenForo Developer Staff Member

    __call and __callStatic will now be respected in the callback check (in 1.4).

    I should also note that 1.4 exposes the site ID in the callback as well.
  6. JoshyPHP

    JoshyPHP Well-Known Member

    Doubly nice, thanks.

Share This Page