#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 (не simpleBehavior
), и после этого все будет работать нормально. Спасибо за вашу помощь!