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. Реальная реализация:

Ссылки могут не работать, проект находится в активной разработке!

Другие вопросы по тегам