Overtriding Dontrine_Record (SFDOCtRinerEcord) أساليب المثيل في العقيدة PHP Symfony
-
24-09-2019 - |
سؤال
خلفيتي في دفع ، لذلك كنت آمل أن يكون من البسيط تجاوز 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.
نصائح أخرى
لست متأكدًا مما تريد القيام به بالضبط, ، ولكن هنا بعض التلميحات:
عقيدة (مع
ATTR_AUTO_ACCESSOR_OVERRIDE
تمكين السمة ، والتي هو يتيح لك تمكين Symfony) تجاوز عدد أعمدة مكونات معينة فقط عن طريق تحديدgetColumnName
الطرق في فئة النموذج. لهذا السبب الخاص بكgetDisplayName
يمكن أن تسقط الطريقة حلقة لا حصر لها والتي تسبب عادة segfault.للوصول/تعديل قيمة العمود مباشرة (تجاوز مخصص (الحصول على | تعيين) ters) عليك استخدام
_get('column_name')
و_set('column_name')
الطرق المحددة بواسطةDoctrine_Record
صف دراسي.كل ال
$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);
}