symfoniacs: entity lifecycle

11
Doctrine Entity Lifecycle Обработка изменения состояний сущностей

Upload: -

Post on 19-Jul-2015

193 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Symfoniacs: Entity lifecycle

Doctrine Entity LifecycleОбработка изменения состояний сущностей

Page 2: Symfoniacs: Entity lifecycle

Lifecycle Callbacks

prePersist

postPersist

preUpdate

postUpdate

preRemove

postRemove

Page 3: Symfoniacs: Entity lifecycle

Плюсы

Нет требуют создавать отдельный класс для реализации логики

обработки событий

Traits?????

Минусы

Ограничены контекстом Entity и не имеют доступа к service

container (как и сама Entity)

Page 4: Symfoniacs: Entity lifecycle

Пример обработки заливки файлов

с помощью Lifecycle Callbacks

/**

* @ORM\PostPersist()

* @ORM\PostUpdate()

*/

public function upload()

{

// …

$this→getFile()→move($this→getUploadRootDir(), …);

// …

}

protected function getUploadRootDir()

{

return __DIR__.'/../../../../web/'.$this->getUploadDir();

}

* из официального мануала по

Symfony

Page 5: Symfoniacs: Entity lifecycle

Event Listener/Subscriber

Lifecycle Callbacks

loadClassMetadata

preFlush

onFlush

postFlush

onClear

Page 6: Symfoniacs: Entity lifecycle

Плюсы

Позволяет обратиться к service container

Имеет больше «полномочий» чем Lifecycle Callbacks

Идеально подходит для прослушивания событий от всех Entity

Минусы

Не очень годится для прослушивания событий от части множества

всех Entity

Требует создания отдельного класса и регистрации его как сервиса

Page 7: Symfoniacs: Entity lifecycle

Портируем заливку файлов

с Lifecycle Callbacks на Event Subscriber

public function postPersist(EventArgs $event)

{

// …

if($eventArgs→getEntity() instanceof AttachedFile)

{

// …

}

// …

}

* из официального мануала по

Doctrine

Page 8: Symfoniacs: Entity lifecycle

EntityListener

Плюсы

Обладает возможностью доступа к service container

Регистрируется для Entity на уровне класса/иерархии классов

Возможность легко комбинировать Listener’ы в Entity-классах

Минусы

Требует создания отдельного класса и регистрации его как сервиса

Page 9: Symfoniacs: Entity lifecycle

Тот же самый пример с использованием

Entity Listener

class UploadListener

{

protected function preUpload($entity)

{

$this→uploadService→upload($entity→getFile());

}

// …

}

/**

* @ORM\Entity

* @ORM\EntityListeners({"UploadListener"})

*/

class AttachedFile

{

public function getFile() { /* … */ }

// …

}

Page 10: Symfoniacs: Entity lifecycle

Затрагивает все сущности?

Требуется service container?

Event Listener

Entity Listener

Lifecycle Callback

да

да

нет

нет

Page 11: Symfoniacs: Entity lifecycle

– Леонид Репин, Levelab

[email protected]

@initpenguin

Doctrine Entity Lifecycle