Overtriding Dontrine_Record (SFDOCtRinerEcord) أساليب المثيل في العقيدة PHP Symfony

StackOverflow https://stackoverflow.com/questions/2587115

سؤال

خلفيتي في دفع ، لذلك كنت آمل أن يكون من البسيط تجاوز getter سحرية في عقيدة _record (sfdocterinecord) ، لكنني أحصل على segfault أو يتم تجاهل طريقة التجاوز ببساطة لصالح واحد في فئة فائقة.

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

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 يمتد العقيدة)؟ يجب أن يكون هذا قابلاً للتنفيذ ... أم يجب أن أنظر إلى وثائق القالب؟

شكرا يا براين

هل كانت مفيدة؟

المحلول

حاول _get و _set.

نصائح أخرى

لست متأكدًا مما تريد القيام به بالضبط, ، ولكن هنا بعض التلميحات:

  1. عقيدة (مع ATTR_AUTO_ACCESSOR_OVERRIDE تمكين السمة ، والتي هو يتيح لك تمكين Symfony) تجاوز عدد أعمدة مكونات معينة فقط عن طريق تحديد getColumnName الطرق في فئة النموذج. لهذا السبب الخاص بك getDisplayName يمكن أن تسقط الطريقة حلقة لا حصر لها والتي تسبب عادة segfault.

  2. للوصول/تعديل قيمة العمود مباشرة (تجاوز مخصص (الحصول على | تعيين) ters) عليك استخدام _get('column_name') و _set('column_name') الطرق المحددة بواسطة Doctrine_Record صف دراسي.

  3. كل ال $obj->getSomething(), $obj->something و $obj['something'] المكالمات هي في الواقع سحرية. يتم "إعادة توجيههم" إلى $obj->get('something') وهو فقط حقيقة طريقة للوصول إلى بيانات النموذج.

هذا يعمل:

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;

  }

}

تكوين العقيدة:

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

من ثم:

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

public function setAnything()
{
    return $this->_set('anything', $value);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top