Как оптимизировать модели в Zend Framework? - PullRequest
6 голосов
/ 21 февраля 2012

Мне нужно выяснить, как лучше всего использовать модели в Zend Framework.

В настоящее время у меня есть классы, расширяющие Zend_Db_Table_Abstract, которые обрабатывают мои запросы к соответствующей таблице каждого класса.

Когда мне нужно получить доступ, скажем, к 5 из этих таблиц из контроллера, я создаю5 новых экземпляров каждого конкретного Zend_Db_Table объекта.Это действительно неэффективно.

Я думал о реализации шаблона Factory для создания новых экземпляров (или предоставления существующей статической копии), но не уверен.Это лучший способ сделать это?

Как правильно обращаться с моделями, обеспечивающими скорость без чрезмерных затрат ресурсов?Если в игру вступит ленивая загрузка?

[EDIT] Например, у меня есть класс, который я использую для обработки получения информации о местоположении из необработанного поискового запроса, и мне нужны эти объекты вЧтобы проанализировать запрос:

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

В другом классе мне может понадобиться снова обратиться к этим моделям, поэтому я повторяю приведенный выше код.По сути, реинициализация объектов, которые могут быть статичными / одноэлементными.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Я, как и вы, работаю в DbTable. Я обнаружил, что это эффективно, когда мне нужно запросить несколько таблиц одним действием, чтобы создать другой слой модели над таблицей dbTable. Аналогично сервису или домену. Таким образом, мне нужно назвать только одну модель, но у меня все еще есть нужные мне функции.

Вот простой пример, который может в конечном итоге взаимодействовать с 5 классами DbTable и, скорее всего, с парой классов Row:

<?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;
    }

} 

Надеюсь, это поможет.

[EDIT] С тех пор как я написал этот ответ, я узнал о преимуществах доменных моделей и картографов данных. Вау, какая разница в моем приложении. Не волшебная пуля, а огромное улучшение.
Благодаря
Алехандро Гервасио на PHPMaster.com
Роб Аллен на Akrabat.com
и
Падрайк Брэди в Выживший Глубина

за помощь в понимании этого паттерна.

1 голос
/ 22 февраля 2012

Вы, похоже, находитесь в ситуации, когда вам требуется эффективное управление данными с функциями, которые не включены в текущую среду Zend.Zend не имеет встроенного движка для работы с базами данных любого рода, он просто имеет классы-обертки, которые помогают вам писать ваши запросы.

Вам нужна объектно-реляционная модель (ORM), которая является обязательной-посмотреть в профессиональных рамках.Насколько я понимаю, ORM сам по себе является фреймворком, у него есть шаблоны и строго определенные способы «делать вещи», он поддерживает отложенную загрузку (она берет большую часть из этого) и оптимизирует ваши запросы в полной мере.Когда вы используете ORM, вы даже не пишете SQL, вместо этого вам нужно изменить свою интерпретацию хранения данных, вам нужно забыть о таблицах и сосредоточиться на объектах.Например, в Doctrine каждый тип (таблица) определяется классом, а каждая запись (строка) - экземпляром класса, где у вас есть доступ к различным методам и свойствам.Он поддерживает прослушиватели событий и безумные каскадные соотношения.

Больше не нужно извлекать строки из связанных таблиц при удалении записей (это происходит автоматически), больше не нужно писать сложные и хаотичные сценарии для обеспечения синхронизации файловой системы, вы можетеперейти на почти любой движок БД в любое время (mysql, postgresql, simplesql ..) и многое другое ..

Я использую Doctrine 2 в сочетании с платформой Symfony 2 и должен сказать, что не будувернуться к Zend для чего-нибудь.Да, это сложно и тяжело, но на самом деле окончательное решение.Когда вы подходите к моменту, когда вам нужно управлять сотнями таблиц с миллионами записей - тогда вы увидите разницу.

Итак, итоговое суммирование: ORM - это то, что вам нужно, есть много решений, язнаю два действительно хороших: Doctrine 1 или 2 и Propel.

PS: ORM является независимой частью вашей системы, поэтому вам не нужно использовать конкретную среду, Zend может быть настроен для работы сУчение чудесно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...