2012-02-21 6 views
6

Necesito encontrar una mejor práctica para utilizar modelos de manera eficiente en Zend Framework.¿Cómo optimizar modelos en Zend Framework?

Actualmente, tengo clases que extienden Zend_Db_Table_Abstract que manejan mis consultas a la tabla respectiva de cada clase.

Cuando necesito acceder digamos 5 de esas tablas desde un controlador, me encuentro creando 5 nuevas instancias de cada objeto específico Zend_Db_Table. Esto es realmente ineficaz.

He pensado en implementar un patrón Factory para crear nuevas instancias (o proporcionar una copia estática existente) pero no estoy seguro. ¿Es esta la mejor manera de hacerlo?

¿Cuál es la forma correcta de manejar los modelos asegurando la velocidad sin consumir recursos excesivos? ¿Debería la carga lenta entrar en juego aquí?

[EDIT] A modo de ejemplo, tengo una clase que utilizo para manejar obtener detalles acerca de una ubicación a partir de una consulta de búsqueda en bruto y necesito estos objetos con el fin de analizar la consulta:

// Initialize database object 
$this->dbLocations = new Model_Locations; 
$this->dbStates = new Model_States; 
$this->dbZipcodes = new Model_Zipcodes; 
$this->dbLookup = new Model_Lookup; 

En otra clase, es posible que necesite acceder a esos modelos nuevamente, así que repito el código anterior. Esencialmente la reinicialización de objetos que podría ser estático/singleton.

+1

Su pregunta es bastante asalariada, puede mostrar un ejemplo de código en el que realmente crea instancias de 5 clases de tabla y describe para qué las necesita. – markus

+0

Entiendo sus inquietudes, pero realmente no las sigo. Creo que crear varias instancias de una clase y especialmente una clase abstracta es una cosa específica en OOP. Cuestionar este modelo de tabla es un poco como cuestionarme completamente la POO o la herencia. –

+0

En un nivel básico, el uso en este método es aceptable. Tengo un "manejador" personalizado, por falta de una palabra mejor ", que toma un objeto de consulta, analiza las propiedades en él y lo pasa a un controlador de ubicación que obtiene todos los datos de ubicación para esa consulta, y luego lo pasa a un En muchas fases de esto, necesito acceder a varias tablas y terminar iniciando mucho estos objetos de varias clases. Consulte esto para obtener más información: http://stackoverflow.com/questions./9116838/data-encapsulation-and-data-flow-in-php –

Respuesta

3

tiendo a trabajar en el DbTable como tu lo haces.Lo encontré efectivo cuando necesito consultar múltiples tablas en una sola acción para crear otra capa de modelo sobre el dbTable. Similar a un servicio o capa de dominio. De esta manera, solo tengo que llamar a un solo modelo, pero aún tengo la funcionalidad que necesito.

Aquí está un ejemplo sencillo que eventualmente pueden interactuar con 5 clases DBTABLE y muy probablemente un par de clases de fila, así:

<?php 

class Application_Model_TrackInfo 
{ 


    protected $_track; 
    protected $_bidLocation; 
    protected $_weekend; 
    protected $_shift; 
    protected $_station; 

    public function __construct() { 
     //assign DbTable models to properties for convience 
     $this->_track = new Application_Model_DbTable_Track(); 

    } 

    /** 
    * 
    * @param type $trackId 
    * @return type object 
    */ 
    public function getByTrackId($trackId) { 

     $trackData = $this->_track->fetchRow($trackId); 
     //getAllInfo() Application_Model_Row_TRack 
     $result = $trackData->getAllInfo(); 
     //returns std object reflecting data from 3 DbTable classes 
     return $result; 
    } 

    /** 
    *Get Station from trackid through bidlocationid 
    * 
    * @param type $trackId 
    * @return type object 
    */ 
    public function getStation($trackId){ 

     $data = $this->_track->fetchRow($trackId); 
     //This a Application_Model_Row_Track method 
     $result= $data->getStationFromBidLocation(); 

     return $result; 
    } 

} 

espero que esto ayude.

[EDIT] Desde que escribí esta respuesta he aprendido los beneficios de los modelos de dominio y asignadores de datos. Wow, qué diferencia en mi aplicación. No es una bala mágica, sino una gran mejora.
Gracias a
Alejandro Gervasio encima en PHPMaster.com
Rob Allen en Akrabat.com
y
Pádraic Brady en Surviving The Deepend

por toda su ayuda en la comprensión de este patrón.

+0

Cada vez que utiliza la clase Application_Model_TrackInfo, hace lo que tengo un problema. Crea objetos dbTable que pueden o no ser utilizados, luego se borra, y su próximo uso lo crea todo de nuevo.¿Deberían generarse estas conexiones dbTable en un paradigma de fábrica o múltiples instancias concurrentes, una carga útil aceptable a tener en cuenta? –

+0

@cilosis Parece que es mejor que analice las estrategias de almacenamiento en caché para que pueda minimizar sus consultas de Db. Una solución ORM (con algo de persistencia de datos) también podría ser apropiada. – RockyFord

1

Parece que se encuentra en una situación en la que necesita una gestión de datos eficiente con funciones que el marco actual de Zend no incluye. Zend no tiene un motor incorporado para trabajar con bases de datos de ningún tipo, simplemente tiene una clase contenedora que le ayuda a escribir sus consultas.

Lo que necesita es un modelo relacional de objetos (ORM) que es imprescindible en un marco profesional. Tal como lo entiendo, ORM es un framework en sí mismo, tiene patrones y formas muy definidas de "hacer cosas", admite la carga diferida (aprovecha al máximo) y optimiza sus consultas al máximo. Cuando utiliza ORM, ni siquiera escribe SQL, en su lugar debe cambiar su interpretación del almacenamiento de datos, debe olvidarse de las tablas y centrarse en Objetos. En Doctrine, por ejemplo, cada tipo (tabla) es especificado por una clase y cada registro (fila) como una instancia de clase en la que tiene acceso a diferentes métodos y propiedades. Es compatible con los oyentes de eventos y las locas cascadas de las habitaciones.

Ya no es necesario extraer filas de tablas relacionadas cuando elimina registros (es automático), no necesita escribir scripts complejos y caóticos para garantizar la sincronización del sistema de archivos, puede migrar a casi cualquier motor db en cualquier momento (mysql , postgresql, simplesql ..) y más ...

He estado usando Doctrine 2 junto con el framework Symfony 2 y tengo que decir que no volvería a Zend por nada. Sí, es complejo y pesado, pero realmente la solución definitiva. Cuando llegue el momento en que necesite administrar cientos de tablas con un total de millones de registros, verá la diferencia.

Por lo tanto, suma final: ORM es lo que necesita, hay muchas soluciones, sé de dos realmente buenas: Doctrine 1 o 2 y Propel.

PS: ORM es una parte independiente de su sistema, por lo que realmente no necesita utilizar un marco específico, Zend puede ser configurado para trabajar con Doctrina maravillosamente :)

+4

Zend_Db ES en sí mismo una implementación del patrón ORM. Tu respuesta no aborda el problema real del OP, solo le dice que cambie de herramienta en función de tu opinión personal. Tu primer párrafo está completamente equivocado, lo que sugiere que estás hablando Ut cosas que realmente no sabes. – markus

+0

Sí, y el suyo resuelve el problema completamente. –

+0

No escribí ninguno, porque por el momento, no hay suficiente información en la pregunta para escribir una respuesta. – markus