Как я могу использовать один метод с несколькими моделями Propel в Symfony 1.4?

#php #symfony1 #symfony-1.4 #propel

#php #symfony1 #symfony-1.4 #propel

Вопрос:

У меня есть метод для получения всех строк из таблицы в базе данных в порядке, указанном в аргументах:

 public static function getAllOrderedBy($orders = null)
    {
        $criteria = new Criteria();
        if(is_array($orders))
        {
            foreach($orders as $column => $order)
            {
                if($order == 'asc')
                {
                    $criteria->addAscendingOrderByColumn($column);
                }
                else if($order == 'desc')
                {
                    $criteria->addDescendingOrderByColumn($column);
                }
            }
        }
        else if($orders != null)
        {
            $criteria->addAscendingOrderByColumn($orders);
        }
        return self::doSelect($criteria);
    }
  

Этот метод используется в PagePeer классе, но я хочу использовать его с несколькими моделями, такими как LinkPeer или SubjectPeer .
Я мог бы скопировать и вставить этот код из одной модели в другую, но я хочу спросить, есть ли лучший способ сделать этот метод доступным для всех этих классов?

Это не проблема, если использование изменится, поэтому я не буду вызывать PagePeer:getAllByOrder(PagePeer::TITLE) что-то другое, я просто не хочу копировать этот код в каждую модель, в которой он используется.

Ответ №1:

Это можно сделать двумя способами.

  • Поведение Propel. В документации указано, что вы можете добавить статический метод к своим одноранговым классам через staticMethods()
  • Микширование Symfony. Они были задокументированы в The Definitive Guide to symfony 1.0 . Смотрите Главу 17 — Расширение Symfony. В более новых версиях этого руководства информация о миксинах была удалена, но, похоже, код класса sfMixer не был изменен (sfMixer в sf1.0 и sfMixer в sf1.4)

Комментарии:

1. Я пытался создать класс поведения, как вы предложили, но я не могу заставить его работать. Каждый раз, когда я хочу перестроить свою модель, я получаю следующее сообщение: Propel behavior "peerplus" is not registered . Я поместил этот новый класс в папки проекта lib/behavior/PeerPlusBehavior.php файл, и добавил следующую строку в конце propel.ini: propel.behavior.peerplus.class = lib.behavior.PeerPlusBehavior . И, конечно, добавил поведение в schema.yml, где это необходимо. Что я делаю не так?

2. Хорошо, нашел, что было не так. В схеме. yml вы должны использовать _propel_behaviors не только _behaviors , и указать поведение в соответствии с этим. Кроме того, вам нужно расширить SfPropelBehaviorBase в вашем классе Behavior (не simple Behavior ), и после этого все будет работать нормально. Спасибо за вашу помощь!