Propel2,创建者字段
Propel2, createdBy field
假设我有模型 "Question"。
每个问题都是由用户(当前用户)创建的。
如何 "auto" 将 createdBy
更新为 current.user
在 Doctrine2 中,我应该有依赖于 security.context
的事件侦听器。
事件将订阅 preSave()
,设置 $question->setCreatedBy( $context->getToken()->getUser());
Propel2 如何实现?我可以在控制器中设置 createdBy
,但这很难看:(
我可以编写自定义 behavior,但是如何从行为中访问 security.context
?
半年后我找到了可行的解决方案:)
想法:模型将为 Event Dispatcher
进行 setter 注射。 pre-save
模型将触发事件(validation/user 注入等)。这样我就需要 ED 来保存。我可以在不注入 ED 的情况下 select 来自数据库的对象。
依赖管理器将管理 "repository"。 Repo 将能够在模型上注入所有必需的依赖项,然后调用保存。
$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"]
配置基于 symfony framework。
实际实施:
- 配置-enter link description here
- 型号 - enter link description here
- 控制器 - enter link description here
- "Repo"的工厂enter link description here
链接可能无效,项目正在积极开发中!
假设我有模型 "Question"。
每个问题都是由用户(当前用户)创建的。
如何 "auto" 将 createdBy
更新为 current.user
在 Doctrine2 中,我应该有依赖于 security.context
的事件侦听器。
事件将订阅 preSave()
,设置 $question->setCreatedBy( $context->getToken()->getUser());
Propel2 如何实现?我可以在控制器中设置 createdBy
,但这很难看:(
我可以编写自定义 behavior,但是如何从行为中访问 security.context
?
半年后我找到了可行的解决方案:)
想法:模型将为 Event Dispatcher
进行 setter 注射。 pre-save
模型将触发事件(validation/user 注入等)。这样我就需要 ED 来保存。我可以在不注入 ED 的情况下 select 来自数据库的对象。
依赖管理器将管理 "repository"。 Repo 将能够在模型上注入所有必需的依赖项,然后调用保存。
$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"]
配置基于 symfony framework。 实际实施:
- 配置-enter link description here
- 型号 - enter link description here
- 控制器 - enter link description here
- "Repo"的工厂enter link description here
链接可能无效,项目正在积极开发中!