Symfoniacs: Entity lifecycle

Post on 19-Jul-2015

193 views 1 download

Transcript of Symfoniacs: Entity lifecycle

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

Lifecycle Callbacks

prePersist

postPersist

preUpdate

postUpdate

preRemove

postRemove

Плюсы

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

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

Traits?????

Минусы

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

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

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

с помощью Lifecycle Callbacks

/**

* @ORM\PostPersist()

* @ORM\PostUpdate()

*/

public function upload()

{

// …

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

// …

}

protected function getUploadRootDir()

{

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

}

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

Symfony

Event Listener/Subscriber

Lifecycle Callbacks

loadClassMetadata

preFlush

onFlush

postFlush

onClear

Плюсы

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

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

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

Минусы

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

всех Entity

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

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

с Lifecycle Callbacks на Event Subscriber

public function postPersist(EventArgs $event)

{

// …

if($eventArgs→getEntity() instanceof AttachedFile)

{

// …

}

// …

}

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

Doctrine

EntityListener

Плюсы

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

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

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

Минусы

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

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

Entity Listener

class UploadListener

{

protected function preUpload($entity)

{

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

}

// …

}

/**

* @ORM\Entity

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

*/

class AttachedFile

{

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

// …

}

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

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

Event Listener

Entity Listener

Lifecycle Callback

да

да

нет

нет

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

leonid-repin@levelab.ru

@initpenguin

Doctrine Entity Lifecycle