2015-11-18 2 views
0

J'essaye d'écrire un assistant de vue qui appelle dynamiquement d'autres aides, et j'ai du mal à passer plus d'un argument. Le scénario suivant fonctionnera:zf2 passe plusieurs arguments dans l'appel d'aide dynamique

$helperName = "foo"; 
$args = "apples"; 

$helperResult = $this->view->$helperName($args); 

Cependant, je veux faire quelque chose comme ceci:

$helperName = "bar"; 
$args = "apples, bananas, oranges"; 

$helperResult = $this->view->$helperName($args); 

avec ceci:

class bar extends AbstractHelper 
{ 
    public function __invoke($arg1, $arg2, $arg) 
    { 
     ... 

mais il passe "apples, bananas, oranges"-$arg1 et rien à la autres arguments.

Je ne veux pas avoir à envoyer plusieurs arguments lorsque j'appelle l'aide car les différents assistants prennent différents nombres d'arguments. Je ne veux pas écrire mes helpers pour prendre des arguments comme un tableau parce que le code dans le reste du projet appelle les helpers avec des arguments discrets.

Répondre

2

Votre problème est que l'appel

$helperName = "bar"; 
$args = "apples, bananas, oranges"; 

$helperResult = $this->view->$helperName($args); 

sera interprété comme

$helperResult = $this->view->bar("apples, bananas, oranges"); 

de sorte que vous appelez la méthode avec seulement la première param.


Pour obtenir le résultat attendu, regardez la fonction php call_user_func_array. http://php.net/manual/en/function.call-user-func-array.php

Exemple:

$args = array('apple', 'bananas', 'oranges'); 
$helperResult = call_user_func_array(array($this->view, $helperName), $args); 
+0

Parfait. Dans mon cas, l'assistant reçoit '$ args' comme une chaîne séparée par des virgules, donc je ne peux pas écrire dynamiquement' $ args = array ('apple', 'bananas', 'oranges'); Cependant, la conversion du tableau est facilement réalisée avec '$ args = explode (", ", $ args);'. – jcropp

1

Pour votre cas, vous pouvez utiliser the php function call_user_func_array depuis votre aide est appelable et que vous voulez passer ensemble d'arguments.

// Define the callable 
$helper = array($this->view, $helperName); 

// Call function with callable and array of arguments 
call_user_func_array($helper, $args); 
0

Si vous utilisez PHP> = 5.6, vous pouvez utiliser la fonction de mettre en œuvre variadique au lieu d'utiliser func_get_args().

Exemple:

<?php 
function f($req, $opt = null, ...$params) { 
    // $params is an array containing the remaining arguments. 
    printf('$req: %d; $opt: %d; number of params: %d'."\n", 
      $req, $opt, count($params)); 
} 

f(1); 
f(1, 2); 
f(1, 2, 3); 
f(1, 2, 3, 4); 
f(1, 2, 3, 4, 5); 
?>