-
-
Notifications
You must be signed in to change notification settings - Fork 26
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Internal error: Internal error: Multiple variants - use selectFromArgs() instead. #133
Comments
Hello Arnaud! 👋🏻 I hope @johnbillion will reveal the cause of your error. BTW The second version is more readable! |
After looking at your intention I recommend my 3+1 hooking thingies :) |
Thanks for the report, I'll take a look. |
Sorry @szepeviktor but I haven't found why your repo could help me. 😅 |
Those 4 /**
* @hook one-of-the-four-ways
*/
public static function update_page_builder_data(): void { ... that is all you need. You find minimal documentation in the source code. |
@szepeviktor I prefer the first syntax because it enables me to set several ajax hooks in the same place : class Setup {
const ACTIONS = array(
'save_page_builder_data' => 'update_page_builder_data',
'second_ajax_action' => 'second_ajax_handler',
'third_ajax_action' => 'third_ajax_handler',
'fourth_ajax_action' => 'fourth_ajax_handler',
// ...
);
public static function init(): void {
foreach ( self::ACTIONS as $action => $method ) {
add_action( 'wp_ajax_' . $action, array( self::class, $method ) );
add_action( 'wp_ajax_nopriv_' . $action, array( self::class, $method ) );
}
}
public static function update_page_builder_data(): void {
// code here ...
}
} I find that way of doing cleaner. I have read the codebase of your hooks. However I can't see when I can set the name of the method, that is why I don't see how I could achieve to do what I want in this way. |
@arnaudpfu Okay! Here are all four examples. // 1.
/**
* @hook wp_ajax_save_page_builder_data
*/
public static function update_page_builder_data(): void {
// and call self::hookMethods() method
// 2.
// call
HookConstructorTo::wp_ajax_save_page_builder_data(Setup::class, 10);
// if you want to instantiate a class in a hook
// 3.
// call
HookInitTo::plugins_loaded(Setup::class);
// if you want to instantiate a class and call its `init` method in a hook
// 4.
// call
self::lazyHookStaticMethod('wp_ajax_save_page_builder_data', [Setup::class, 'update_page_builder_data'])
// if you want to load a class and call a static method in a hook |
@arnaudpfu Or the best way! You could match method names and AJAX action names! public function __construct()
{
$classReflection = new ReflectionClass(self::class);
foreach ($classReflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
// Do not hook constructor.
if ($method->isConstructor()) {
continue;
}
\add_action(
'wp_ajax_nopriv_' . $method->name,
[self::class, $method->name],
10,
0
);
\add_action(
'wp_ajax_' . $method->name,
[self::class, $method->name],
10,
0
);
}
} |
@szepeviktor Thanks a lot for your time! 😁 public static function init(): void {
$class_reflection = new ReflectionClass( self::class );
foreach ( $class_reflection->getMethods( ReflectionMethod::IS_PUBLIC ) as $method ) {
if ( ! in_array( $method->name, array_values( self::ACTIONS ), true ) ) {
continue;
}
$action = array_flip( self::ACTIONS )[ $method->name ];
add_action(
'wp_ajax_' . $action,
[ self::class, $method->name ],
10,
0
);
add_action(
'wp_ajax_nopriv_' . $action,
[ self::class, $method->name ],
10,
0
);
}
} But I get the exact same error... |
💡 The whole point of using reflections is to go without the |
All right. I see you don't want to rename your methods ... |
Okay I understand, yes I don't want to rename it. |
I'm also seeing this problem on one of my own plugins now. I'm working on a fix but for some reason I can't get the same error to occur during the unit tests. Working on it. |
* Add a failing test for #133. * Avoid a PHPStan exception when a callback has multiple variants.
I am using PHPStan via the last version of szepeviktor/phpstan-wordpress.
I get this error when I want to analyse my code.
I found that this issue comes from this section of code
This code trigger the issue:
And this code works:
How should I do to be able to use the first syntax ? I think that I need to tell to PHPStan than the values in the ACTIONS array corresponds to the name of method.
The text was updated successfully, but these errors were encountered: