Al desarrollar un panel de administración con el Admin Generator de symfony, en ocasiones nos ocurre que desearíamos poder incrustar código PHP en el archivo generator.yml para cumplir nuestros objetivos. Por ejemplo, supongamos que quisiéramos mostrar un listado de elementos distintos en función de los permisos del usuario que está logueado. Nos encantaría poder hacer algo como esto
generator:
config:
list:
<?php if(sfContext::getInstance()->getUser()->hasCredentials('manager')): ?>
table_method: "doSelectForManagers"
<?php else: ?>
table_method: "doSelect"
<?php endif; ?>El código escrito no daría ningún error y funcionaría … aunque sólo la primera vez ya que una vez compilado este archivo (convertido en PHP) siempre se ejecutaría el método del “table_method” elegido la primera vez.
Una solución no muy buena
Una posible solución para logar nuestro objetivo sería llevar a cabo la lógica para comprobar los credenciales de usuario dentro del propio módelo, algo así:
// lib/model/doctrine/item.class.php class Item extends BaseItem { public function doSelect() { $query = Doctrine_Query()::create(); if(sfContext::getInstance()->getUser()->hasCredentials('manager')) { // Añadir una seria de condiciones a la query }else{ // Añadir otras condiciones a la query } return $query } }
El inconveniente de esta solución es que estaríamos acoplando muy fuertemente nuestro modelo de datos con el usuario de la sesión lo cual nos haría muy difícil hacer pruebas unitarias más adelante, por lo tanto no es muy aconsejable.
Mi solución
La solución que propongo pasa por hacer lo que se hizo al principio sólo que en lugar de sobre el archivo generator.yml sobre el auténtico objeto PHP en el que se convierte este archivo una vez compilado, la clase xxxGeneratorConfiguration, que es precisamente uno de los dos archivos generados bajo la carpeta “lib” en el módulo (si no sabías para que servían estos archivos, ya puedes hacerte una idea,
).
De esta manera el código quedaría de la siguiente manera
// lib/xxxGeneratorConfiguration.class.php class xxxGeneratorConfiguration extends BaseXxxGeneratorConfiguration { public function getTableMethod() { $user = sfContext::getInstance()->getUser()->hasCredentials('manager') if($user->hasCredentials('manager')){ return 'doSelectForManagers'; }else{ return 'doSelect'; } } }
Si quieres conocer algo más en profundidad sobre el admin generator y cómo funciona, a lo mejor te ayude algo la charla que dí en Castellón sobre esto mismo, http://vimeo.com/13325576