2010-10-08 18 views
2

Nous travaillons sur une interface de type Builder qui construit essentiellement une liste pour la gestion CRUD d'objets individuels (puisque nous utilisons ActiveRecord un objet == un enregistrement de base de données).Solutions recommandées pour créer un rappel qui enchaîne plusieurs méthodes et/ou propriétés?

Afin de préciser les valeurs des colonnes et des paramètres pour les options de liste flexibles nous avons implémenté initialement les arguments de rappel comme un tableau qui ressemblait à ceci:

'params' => array(
       'static' => $this->institution->id, 
       array(
       'method1' => array(
           'method_name', 
           array('arg1', 'arg2') 
          ), 
          'prop1' => 'id') 

Cette solution présente des inconvénients évidents seulement en termes de maladresses , etc. mais ça a marché. À la suggestion d'un collègue, nous avons essayé de mettre en place des fermetures, mais en raison d'une autre exigence avec la classe, nous devons sérialiser toutes les données de la classe que nous venons de découvrir ne fonctionnera pas avec les fermetures. La syntaxe des fermetures était évidemment beaucoup plus simple:

'params' => array(
       $this->institution->id, 
       function($obj) { return $obj->method_name($arg1, $arg2)->id; } 
      ) 

Ma première question est de savoir s'il y a un moyen de stocker la fermeture dans un format sérialisable (comme une chaîne), puis reconvertir en une fermeture une fois que la classe est unserialized?

Ou quelqu'un peut-il fournir une suggestion sur une meilleure interface pour résoudre ce genre de problème de rappel?

Répondre

1

Il ya un article excellent et détaillé sur la façon d'utiliser Reflection pour étendre les fermetures pour faire ce que vous voulez: Extending PHP 5.3 Closures with Serialization and Reflection. Cela dit, je me demande si cela est moins gênant que votre solution d'origine, puisque vous devrez passer des objets à la place - cela ne fait que coder légèrement différemment et vous pourriez vous retrouver avec un coup de performance.

+0

C'est en fait la première solution que j'ai trouvée et nous avons fini par aller avec. Afin de garder les choses moins gênantes, nous avons juste implémenté une vérification dans la classe qui a consommé les fermetures afin qu'elles soient converties en classe sérialisable dans le consommateur. –