Каков наилучший способ добавить производное поле в подкласс Doctrine_Record? - PullRequest
4 голосов
/ 20 января 2011

Представьте, что у меня есть таблица с именем "item", в которой есть столбец с именем "price". В дополнение к полной цене, я хотел бы получить разброс цен по 12 месяцам, то есть

class Item extends Doctrine_Record {
  ...
  public function getMonthlyPrice() {
    return $this->price/12;
  }
}

Теперь, скажем, я бы хотел, чтобы Item действовал так, будто месячная цена - это просто другой столбец, а не вызов функции, например,

$m = Doctrine_Core::getTable("Item")->find(1);
echo $m->price; //prints 120
echo $m->monthlyPrice; //prints 10

Мой первый инстинкт - переопределить метод __get (). Есть ли лучший или более стандартный способ сделать это в Доктрине?


Бонусный вопрос:

Есть ли какой-нибудь очень умный способ, которым я могу настроить объект, поэтому, когда я делаю

var_dump($m->getData())

Понятно

array
  'price' => 120
  'monthlyPrice' => 10

Это было бы довольно изящно.

Ответы [ 2 ]

1 голос
/ 20 января 2011

Я думаю, что вам нужны фильтры записи. Я действительно не знаю Доктрины, я в основном использую Propel сам; но это звучит так, как будто это может выполнить то, что вам нужно:

http://www.doctrine -project.org / проекты / ОРМ / 1,2 / Docs / ручной / задающие-модели / пл # зачетные фильтры

0 голосов
/ 22 марта 2011

Как сказал Брайан, вы можете сделать это с помощью фильтров, но есть еще один способ, который, я думаю, ближе к тому, что вы ищете - вам нужно включить функцию ATTR_AUTO_ACCESSOR_OVERRIDE в Doctrine, что означает, что он будет проверять методы в форма get * и set *, которые соответствуют вашей собственности, вызывают их автоматически. Вот пример:

class Example extends Doctrine_Record {

    public function getFoo() {
        return 'foo';
    }
}

Doctrine_Manager::getInstance()->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE, true);

$example = new Example();
echo $example->foo;

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

...