Doktrini varsayılan hidratörün nasıl ayarlanır?

2 Cevap php

Ben Doktrini varsayılan hidratörün ayarlamak için bir yol bulamıyorum. Bu mevcut olmalıdır. Değil mi?

http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/data-hydrators.html#writing-hydration-method

Yukarıdaki belgeleri sayfası özel Nemlendirici nasıl oluşturulacağını açıklar. Burada dezavantajı size bir sorguyu çalıştırmak ve her vakit hidratörün "belirtmek" için ihtiyaç olmasıdır.

2 Cevap

Ben Chris Gutierrez yorum okuma ve bazı şeyler değiştirerek bu anladım.

Birincisi, Doctrine_Query için bir uzantısı sınıfını tanımlar. Kendi hidrasyon modu tanımlamak için kurucu uzatın.

class App_Doctrine_Query extends Doctrine_Query
{
    public function __construct(Doctrine_Connection $connection = null,
        Doctrine_Hydrator_Abstract $hydrator = null)
    {
        parent::__construct($connection, $hydrator);
        if ($hydrator === null) {
            $this->setHydrationMode(Doctrine::HYDRATE_ARRAY); // I use this one the most
        }
    }
}

Ardından, bootstrap yılında, yeni sınıf hakkında Doktrini söyle.

Doctrine_Manager::getInstance()->setAttribute(Doctrine_Core::ATTR_QUERY_CLASS, 'App_Doctrine_Query');  

Chris Gutierrez küresel bağlantı yerine özniteliğini tanımlanmış ama ben birden fazla bağlantı var ve hepsi için bu varsayılan kullanmak istiyorum.

Şimdi Doctrine_Query :: setHydrationMode (bir sorgu oluşturmak) her zaman aramak zorunda değilsiniz.

Here's more information
http://www.doctrine-project.org/projects/orm/1.2/docs/manual/configuration/en#configure-query-class

EDIT: Changes below

Ben yukarıda bir sorun bulduk. Özellikle, gibi bir şey yapıyor "Doctrine_Core :: gettable ('Model') -> find (1)" her zaman hidrate dizi değil, bir nesne döndürür. Yani özel bir sorgu çağrısı kullanım yöntemlerini yürütmek tanımlayan, bu biraz değişmiş.

Ayrıca, ben bellek azat kod eklendi.

class App_Doctrine_Query extends Doctrine_Query
{
    public function rows($params = array(), $hydrationMode = null)
    {
        if ($hydrationMode === null)
            $hydrationMode = Doctrine_Core::HYDRATE_ARRAY;
        $results = parent::execute($params, $hydrationMode);
        $this->free(true);
        return $results;
    }

    public function row($params = array(), $hydrationMode = null)
    {
        if ($hydrationMode === null)
            $hydrationMode = Doctrine_Core::HYDRATE_ARRAY;
        $results = parent::fetchOne($params, $hydrationMode);
        $this->free(true);
        return $results;
    }
}

Bu harika bir fikir olurdu, ve soruyu okurken ben bunu Doktrini üzerinden yapabileceği bir şey olacağını düşünmüştüm. Ancak, kod aracılığıyla okuma beni yapamazsın düşündürüyor:

Hidrasyon modu - Doctrine_Query::create() Doctrine_Query_Abstract::__construct() sadece ilk argüman, ikinci argüman belirtmeden bağlantıyı belirterek, yeni bir sorgu oluşturur. Yapılandırma için hiçbir çağrı yapılır. Hiçbir hidratörde geçirilir gibi, yeni bir Doctrine_Hydrator oluşturulur ve yapıcı eşit bir yapılandırma seçeneği için herhangi bir yerde görünmüyor, ve böylece varsayılan Doctrine::HYDRATE_RECORD ayarı vardır.

Belki aşağıda fabrika yöntemi ile Doctrine_Query sınıflara kolay seçenektir?

public static function create($conn = null)
{
    return new Doctrine_Query($conn,Doctrine::HYDRATE_ARRAY);
}