Doktrin PHP Symfony overriding Doctrine_Record (sfDoctrineRecord) örnek yöntemleri

4 Cevap php

Benim arka plan uskur olduğunu, bu yüzden bir Doctrine_Record (sfDoctrineRecord) büyülü bir getter geçersiz kılmak için basit bir şey olacağını umuyordum, ama ben bir segfault veya geçersiz kılma yöntemi sadece içinde birinin lehine göz ardı edilir ya alıyorum superclass.

https://gist.github.com/697008eaf4d7b606286a

class FaqCategory extends BaseFaqCategory
{

  public function __toString()
  {
    return $this->getCategory();
  }

  // doesn't work
  // override getDisplayName to fall back to category name if getDisplayName doesn't exist
  public function getDisplayName() {

    // also tried parent::getDisplayName() but got segfault(!)
    if(isset($this->display_name)) {
      $display_name = $this->display_name;
    } else {
      $display_name = $this->category;
    }

    return $display_name;

  }

}

(SfDoctrineRecord Doctrine_Record uzanır yoluyla) / Doctrine_Record örneğinde geçersiz kılma yöntemleri uzatmak için uygun Doktrini yolu nedir? Bu yapılabilir olmalı ... ya da ben Şablon belgelerine bakarak olmalıdır?

Thanks, Brian

4 Cevap

_GET Ve _set yöntemleri deneyin.

Burada exactly, ama istediğim ne hakkında emin değil bazı ipuçları şunlardır:

  1. (is symfony tarafından etkin etkin ATTR_AUTO_ACCESSOR_OVERRIDE niteliği ile) Doktrin sadece modeli sınıfında getColumnName yöntemler tanımlayarak, belirli bileşen sütunlar 'alıcılar geçersiz kılmak için izin verir. Lütfen getDisplayName yöntem genellikle segfault neden sonsuz bir döngüye düşebilir nedeni budur.

  2. Eğer _get('column_name') ve Doctrine_Record sınıfı tarafından tanımlanan _set('column_name') yöntemleri kullanmak zorunda | erişimi / (set) içinde birbirlerine özel atlayarak (olsun) doğrudan sütun değerini değiştirin.

  3. Bütün $obj->getSomething(), $obj->something ve $obj['something'] çağrıları aslında büyülü. Onlar $obj->get('something') hangi modelin verilere erişmek için sadece real yoludur "yönlendirildi" vardır.

Bu çalışır:

class FaqCategory extends BaseFaqCategory
{

  public function __toString()
  {
    return $this->getCategory();
  }

  public function getDisplayName() {

    if($this->_get("display_name") != "") {
      $display_name = $this->_get("display_name");
    } else {
      $display_name = $this->getCategory();
    }

    return $display_name;

  }

}

Doktrini yapılandırın:

$manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true); 

sonra:

public function getAnything()
{
    return $this->_get('anything');
}

public function setAnything()
{
    return $this->_set('anything', $value);
}