Propel2, созданный полем
Допустим, у меня есть модель "Вопрос". Каждый вопрос создается пользователем (текущим пользователем). Как "авто" обновить createdBy
в current.user
В Doctrine2 у меня должен быть прослушиватель событий с зависимостью от security.context
, И событие подпишется на preSave()
, настройка $question->setCreatedBy( $context->getToken()->getUser());
Как этого добиться с Propel2? Я мог бы установить createdBy
в контроллере, но это некрасиво:(
Я мог бы написать собственное поведение, но как получить доступ security.context
из поведения?
1 ответ
Спустя ~ пол года я нашел рабочее решение:)
Идея: у модели будет сеттер для впрыска Event Dispatcher
, На pre-save
модель сгенерирует событие (валидация / инъекция пользователя и т. д.). Таким образом, мне требуется ED для сохранения. Я могу выбрать объекты из БД без введения ED. Менеджер зависимостей будет управлять "хранилищем". Repo сможет внедрить все необходимые зависимости в модель и затем вызвать save.$depepndanciesManager->getModelRepo->save($model)
, Ведьма сделает:
$model->setEventDispacher($this->getEventDispacher);
$model->save();
Пример модели:
class Lyric extends BaseLyric
{
private $eventDispacher;
public function preSave(ConnectionInterface $con = null)
{
if (!$this->validate()) {
// throw exception
}
$this->notifyPreSave($this);
return parent::preSave($con);
}
private function getEventDispacher()
{
if ($this->eventDispacher === null) {
throw new \Exception('eventDispacher not set');
}
return $this->eventDispacher;
}
public function setEventDispacher(EventDispacher $eventDispacher)
{
$this->eventDispacher = $eventDispacher;
}
private function notifyPreSave(Lyric $lyric)
{
$event = new LyricEvent($lyric);
$this->getEventDispacher()->dispatch('tekstove.lyric.save', $event);
}
}
Пример репозитория:
class LyricRepository
{
private $eventDispacher;
public function __construct(EventDispacher $eventDispacher)
{
$this->eventDispacher = $eventDispacher;
}
public function save(Lyric $lyric)
{
$lyric->setEventDispacher($this->eventDispacher);
$lyric->save();
}
}
Пример использования из контроллера:
public function postAction(Request $request)
{
$repo = $this->get('tekstove.lyric.repository');
$lyric = new \Tekstove\ApiBundle\Model\Lyric();
try {
$repo->save($lyric);
// return ....
} catch (Exception $e) {
// ...
}
}
Пример конфигурации:
tekstove.lyric.repository:
class: Tekstove\ApiBundle\Model\Lyric\LyricRepository
arguments: ["@tekstove.event_dispacher"]
Config основан на фреймворке Symfony. Реальная реализация:
- config - введите описание ссылки здесь
- модель - введите описание ссылки здесь
- контроллер - введите описание ссылки здесь
- "Репо" фабрика введите ссылку здесь
Ссылки могут не работать, проект находится в активной разработке!