Combinando TableGateway, Hydrator y sus estrategias en Zend Framework 2
Obtenemos el adaptador de la Base de datos con el Localizador de servicio
$sm = $this->getServiceLocator();
$dbAdapter = $sm->get('DbAdapter');
Instanciamos el Hydrator y Modelo que hidrataremos
$hydrator = new \Zend\Stdlib\Hydrator\ObjectProperty();
$tag = new \Application\Model\Tag();
Añadimos una estrategia personalizada al hydrator para la propiedad tag de nuestro modelo para este caso como es más rápido he hecho uso de la clase para definir estrategias mediante closures, decir que existe también otros hydratadores predefinidos como ArraySerializable y ClassMethods entre otros
$hydrator->addStrategy('tag', new \Zend\Stdlib\Hydrator\Strategy\ClosureStrategy(
//Función que gestiona la estrategia de extracción
function($value){
return($value);
},
//Función que gestiona la estrategia de hidratacíón
function($value){
//Al tag obtenido de la base de datos le concatenamos una url
$value = 'http://programadormalaga.es/'.$value;
return($value);
}
));
Generamos un ResultSet con la clase HydratingResultSet que realice la hidratación pasándole como parametros el modelo y el hydrator
$resultSet = new \Zend\Db\ResultSet\HydratingResultSet(
$hydrator, $tag
);
Instanciamos TableGateway con toda la configuración que hemos hecho y extraemos los registros
$tableGateway = new \Zend\Db\TableGateway\TableGateway('tags',$dbAdapter,null,$resultSet);
$registros = $tableGateway->select();
Pasamos el resultado a la vista
return new ViewModel(array('tags' => $registros ));
Acción completa:
public function TableGatewayHydratorAction()
{
$sm = $this->getServiceLocator();
$dbAdapter = $sm->get('DbAdapter');
$hydrator = new \Zend\Stdlib\Hydrator\ObjectProperty();
$tag = new \Application\Model\Tag();
$hydrator->addStrategy('tag', new \Zend\Stdlib\Hydrator\Strategy\ClosureStrategy(
//Función que gestiona la estrategia de extracción
function($value){
return($value);
},
//Función que gestiona la estrategia de hidratacíón
function($value){
//Al tag obtenido de la base de datos le concatenamos una url
$value = 'http://programadormalaga.es/'.$value;
return($value);
}
));
$resultSet = new \Zend\Db\ResultSet\HydratingResultSet(
$hydrator, $tag
);
$tableGateway = new \Zend\Db\TableGateway\TableGateway('tags',$dbAdapter,null,$resultSet);
$registros = $tableGateway->select();
return new ViewModel(array('tags' => $registros ));
}
En nuestra vista:
foreach ($this->tags as $key => $value) {
echo $value->getTag()."<br/>";
}
Fuente de documentación: Matthew Setter Blog