C’est chatouilleux si on l’utilise pas exactement comme prévu !
Exemple, dans Clearbricks le code de l’URL handler est celui-ci, pour en enregistrer un nouveau :
/**
* Register an URL handler
*
* @param string $type The URI type
* @param string $url The base URI
* @param string $representation The URI representation (regex, string)
* @param callable $handler The handler
*/
public function register(string $type, string $url, string $representation, callable $handler): void
{
$this->types[$type] = [
'url' => $url,
'representation' => $representation,
'handler' => $handler,
];
}
Côté Dotclear on l’étend avec ce code :
/**
* Register an URL handler
*
* @param string $type The type
* @param string $url The url
* @param string $representation The representation
* @param callable $handler The handler
*/
public function register(string $type, string $url, string $representation, callable $handler): void
{
$t = new ArrayObject([$type, $url, $representation, $handler]);
dcCore::app()->callBehavior('publicRegisterURL', $t);
parent::register($t[0], $t[1], $t[2], $t[3]);
}
Et par exemple dans le plugin Pages on l’appelle avec ce code :
dcCore::app()->url->register('pages', 'pages', '^pages/(.+)$', ['urlPages', 'pages']);
Et là, ça hurle parce que :
Fatal error: Uncaught TypeError: dcUrlHandlers::register(): Argument #4 ($handler) must be of type callable, array given, called in …/git-dc/plugins/pages/_prepend.php on line 21 and defined in …/git-dc/inc/public/lib.urlhandlers.php on line 51
On tombe sur le problème où une classe n’est pas (encore) connue et donc la méthode urlPages::pages()
n’est pas définie. D’ailleurs remplacer 'urlPages'
par urlPages::class
ne change rien au problème.
On peut régler ça en plaçant la classe en question dans le fichier où se trouve l’enregistrement, mais c’est moyen élégant comme manière de faire.
Bref, pour l’instant, on va s’en tenir à autoriser les deux types d’argument, callable
et array
et présumer qu’au moment de l’exécution les classes indiquées sont connues.
On verra par la suite si c’est utile d’aller plus loin…