Date post: | 13-Apr-2017 |
Category: |
Internet |
Upload: | konference-phplive |
View: | 72 times |
Download: | 0 times |
Doctrine2 Behaviour Extensionszaostřeno na stromy
Nikol Ježková
Doctrine2 Behaviour Extensions
● Tree
● Translatable
● Sluggable
● Uploadable
● Loggable
● Sortable
● Timestampable
● IpTraceable
● Blameable
● SoftDeletable
● References
● ReferenceIntegrity
gedmo/doctrine-extensions
● $ composer require gedmo/doctrine-extensions●
ORM, ODM
Doctrine 2.2.x – 2.5.x
PHP ≥ 5.4
Kompatibilita
https://github.com/Atlantic18/DoctrineExtensions
ListenersTranslationTreeSluggableTimestampable
...
onFlush
EntityManager
Entita
AnnotaceXMLYAML
EventManager
Doctrine Event System
mapování
Hierarchická data
Nested-Set chování
@Gedmo\Tree
\Gedmo\Tree\TreeListener
type [Nested-set, Closure-table, Materialized-path]
level1
2
3
parent
parent
child child
child child
parent
child
Nested-Set behaviour
@Gedmo\TreeLevel 1 12
5 63 4 9 10
2 7 8 11
@Gedmo\Tree(type="nested")
1
2
3
@Gedmo\TreeLeft @Gedmo\TreeRight
@Gedmo\TreeParent
1
2 3
use Gedmo\Mapping\Annotation as Gedmo;
trait NestedSetEntity
getRootNodes
getPath
getChildren
getLeafs
getNextSiblings
getPrevSiblings
getNodesHierarchy
moveUp
moveDown
NestedTreeRepository
persistAsFirstChild
persistAsFirstChildOf
persistAsLastChild
persistAsLastChildOf
persistAsNextSibling
persistAsNextSiblingOf
persistAsPrevSibling
persistAsPrevSiblingOf
removeFromTree
@Gedmo\TreeLevel
@Gedmo\TreeParent
@Gedmo\TreePath
@Gedmo\TreePathSource
@Gedmo\Tree(type="materializedPath")
MaterializedPathRepository, trait MaterializedPath
id title parent_id path lvl
1 PC null pc-1 1
2 Notebook 1 pc-1,Notebook-2 2
3 MacBook 2 pc-1,Notebook-2, MacBook-3 3
4 MacBook Air 3 pc-1,Notebook-2, MacBook-3, MacBook Air-4 4
MaterializedPathRepository
getRootNodes [Query / QueryBuilder]
getPath [Query / QueryBuilder]
getNodesHierarchy [Query / QueryBuilder]
getTree [Query / QueryBuilder]
getChildren [Query / QueryBuilder]
childrenHierarchy
@Gedmo\TreeLevel
@Gedmo\TreeParent
addClosure
@Gedmo\Tree(type="closure")@Gedmo\TreeClosure(class="ClosureEntity")
ClosureTreeRepository
ancestor descendant depth
ClosureEntity extends AbstractClosure Entity
ClosureTreeRepository
getRootNodes [Query / QueryBuilder]
getPath [Query / QueryBuilder]
getNodesHierarchy [Query / QueryBuilder]
getTree [Query / QueryBuilder]
getChildren [Query / QueryBuilder]
childrenHierarchy
removeFromTree
@Gedmo\Uploadable
UploadableListener, interface Uploadable
@Gedmo\UploadableFilePath
@Gedmo\UploadableFileName
@Gedmo\UploadableFileMimeType
@Gedmo\UploadableFileSize
@Gedmo\Uploadable
path filenameGenerator allowOverwrite appendNumber callback
$fileinfo = $_FILES['foo'];x
$fileinfo instanceOf Uploadable\FileInfo\FileInfoArray; // UploadableListener $listener->addEntityFileInfo($file, $fileinfo);
Translatable
TranslatableListener
@Gedmo\Translatable
@Gedmo\Locale
TranslationRepository
Entita Listener
@Gedmo\Locale@Gedmo\Translatable
setLocale
$defaultLocale
$locale
class Article implements \Gedmo\Translatable\Translatable{ ...
$article = new \Entity\Article;$article->setTitle('Konference');$article->setContent(Začátek');
// TranslationRepository$repo->translate($article, 'title', 'de_de', 'Konferenz') ->translate($article, 'content', 'de_de', 'Beginn');$em->persist($article);$em->flush();
$article->setLocale('de_de');$em->refresh($article);
$article->setLocale('cs_cz');$em->refresh($article);
$article = $repo->findObjectByTranslatedField('title', 'Konferenz', '\Entity\Article');
\Gedmo\Translatable\Entity\Repository\TranslationRepository
@Gedmo\Slug(
fields={"title", "content"}
separator="="
prefix="begin-"
suffix="-end"
style="lower"
updatable
unique
handlers
)
Sluggable
SluggableListener
begin-konference=phplive=brno=zilina-end
$entity->title = 'Konference PHPLive';
$entity->content = 'Brno Žilina'
@Gedmo\SlugHandler
● class: RelativeSlugHandler
● options
– relationField
– relationSlugField
● class: TreeSlugHandler
● options
– parentRelationField
– relationSlugField
@Gedmo\Slug( handlers={ @Gedmo\SlugHandler(
class="RelativeSlugHandler", options={ @Gedmo\SlugHandlerOption( name="relationField", value="entity" ), @Gedmo\SlugHandlerOption( name="relationSlugField", value="slug" ),
@Gedmo\SlugHandlerOption( name="separator", Value="/" )
})
}, fields={"title"})
@Gedmo\SortablePosition
@Gedmo\SortableGroup
setPosition(-1)
SortableRepository
getBySortableGroups(['title' => 'PHP live'])
id: 2 – 4 – 5 – 3 – 1
Sortable
SortableRepository
id SortableGroup$title
SortablePosition$position
1 PHP live 5
2 PHP live 1
3 PHP live 4
4 PHP live 2
5 PHP live 3
@Gedmo\Timestampable● trait TimestampableEntity
@Gedmo\IpTraceable● trait IpTraceableEntity
on creatte/update/changefieldvalue
Timestampable, IpTraceable
TimestampableListener, IpTraceableListener
@Gedmo\Mapping\Annotation\Blameable(
on creatte/update/change
field
value
)
Blameable
BlameableListener, trait BlameableEntity
@Gedmo\Versioned
LogEntryRepository
->revert($entity, 1)
@Gedmo\Loggable
LoggableListener
id
action
logged_at
object_id
object_class
version
data
trait SoftDeleteableEntity
SoftDeleteable(fieldName="deletedAt")
SoftDeleteableFilter
SoftDeleteableFilter
enable null
disablefind
disableForEntity
enableForEntity
enable
null in DBdisabledelete
disableForEntity
enableForEntity
mark in DB
References, ReferenceIntegrity
entity
entity
ReferencesListener
ReferenceIntegrityListener
● StofDoctrineExtensionsBundle
● gedmo/doctrine-extensions
Uploadable\Stof\DoctrineExtensionsBundle\Uploadable\UploadableManager
Symfony\Component\HttpFoundation\File\UploadedFile
$manager->markEntityToUpload($file, $uploadedFile);
● Kdyby/Doctrine● rixxi/gedmo
laravel-doctrine/extensions
● Propel
nested_set, sluggable, timestampable, sortable, versionable
● Eloquent ORM [laravel]
Soft Deleting, Timestamps
● RedBeanPHP
tree
Behaviours v jiných ORM
Děkuji za pozornost :-)