Contributte Doctrine-extensions-knplabs
# Content
Doctrine (KnpLabs/DoctrineBehaviors (opens new window)) extension for Nette Framework
# Setup
Install package
composer require nettrine/extensions-knplabs
Register extension
extensions:
nettrine.extensions.knplabs: Nettrine\Extensions\KnpLabs\DI\KnpLabsBehaviorExtension
2
# Configuration
By default all behaviors are disabled, you have to enable them.
Most of the behaviors include a subscriber. If you use nettrine/dbal (opens new window) then they are configured automatically. Otherwise you have to add them to the Event manager.
Behaviors blameable
, geocodable
, sluggable
, softDeletable
, sortable
, timestampable
, translatable
and tree
have option trait
(or *Trait
) which allows you to swap the implementation.
Behaviors blameable
, geocodable
, loggable
and translatable
accept a callable
. You may use all of following syntaxes:
# Static method call (or any other valid callable, like 'someFunction')
exampleCallable: [StaticClass, 'calledMethod']
exampleCallable: [@service, 'calledMethod'],
# Reference to service which implements __invoke()
exampleCallable: @serviceWhichImplements__invoke()
# Register and use new service which implements __invoke(), like you would in 'services' config section
exampleCallable:
factory: Your\Special\Service
2
3
4
5
6
7
8
9
10
11
12
# Blameable (opens new window)
Enable behavior
nettrine.extensions.knplabs:
blameable: true
2
Or, if you want to add additional options
nettrine.extensions.knplabs:
blameable:
userCallable: callable ## returns object specified by userEntity or object which implements __toString() or string
userEntity: Your\User\Entity
trait: YourBlameableTrait
2
3
4
5
You may use Nettrine\Extensions\KnpLabs\Security\UserCallable
for Nette\Security\User::getId()
Use trait in entity
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as Behaviors;
class BlameableEntity
{
use Behaviors\Blameable\Blameable;
}
2
3
4
5
6
7
8
9
# Filterable (opens new window)
Use trait in repository and implement abstract methods
use Doctrine\ORM\EntityRepository;
use Knp\DoctrineBehaviors\ORM as Behaviors;
final class FilterableRepository extends EntityRepository
{
use Behaviors\Filterable\FilterableRepository;
public function getLikeFilterColumns(): array
{
// TODO: Implement getLikeFilterColumns() method.
}
public function getILikeFilterColumns(): array
{
// TODO: Implement getILikeFilterColumns() method.
}
public function getEqualFilterColumns(): array
{
// TODO: Implement getEqualFilterColumns() method.
}
public function getInFilterColumns(): array
{
// TODO: Implement getInFilterColumns() method.
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Geocodable (opens new window)
Enable behavior
nettrine.extensions.knplabs:
geocodable: true
2
Or, if you want to add additional options
nettrine.extensions.knplabs:
geocodable:
geolocationCallable: callable # accepts entity, returns Point|false
trait: YourGeocodableTrait
2
3
4
Use trait in entity
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as Behaviors;
class GeocodableEntity
{
use Behaviors\Geocodable\Geocodable;
}
2
3
4
5
6
7
8
9
Use trait in repository
use Doctrine\ORM\EntityRepository;
use Knp\DoctrineBehaviors\ORM as Behaviors;
final class GeocodableRepository extends EntityRepository
{
use Behaviors\Geocodable\GeocodableRepository;
}
2
3
4
5
6
7
8
9
# Joinable
Use trait in repository
use Doctrine\ORM\EntityRepository;
use Knp\DoctrineBehaviors\ORM as Behaviors;
final class JoinableRepository extends EntityRepository
{
use Behaviors\Joinable\JoinableRepository;
}
2
3
4
5
6
7
8
9
# Loggable (opens new window)
Enable behavior
nettrine.extensions.knplabs:
loggable:
loggerCallable: callable # accepts message
2
3
You may use Knp\DoctrineBehaviors\ORM\Loggable\LoggerCallable
for PSR-3 logger or Nettrine\Extensions\KnpLabs\Tracy\LoggerCallable
for Tracy logger.
Use trait in entity
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as Behaviors;
class LoggableEntity
{
use Behaviors\Loggable\Loggable;
}
2
3
4
5
6
7
8
9
# Sluggable (opens new window)
Enable behavior
nettrine.extensions.knplabs:
sluggable: true
2
Or, if you want to add additional options
nettrine.extensions.knplabs:
sluggable:
trait: YourSluggableTrait
2
3
Use trait in entity and implement abstract methods
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as Behaviors;
class SluggableEntity
{
use Behaviors\Sluggable\Sluggable;
public function getSluggableFields(): array
{
// TODO: Implement getSluggableFields() method.
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# SoftDeletable (opens new window)
Enable behavior
nettrine.extensions.knplabs:
softDeletable: true
2
Or, if you want to add additional options
nettrine.extensions.knplabs:
softDeletable:
trait: YourSoftDeletableTrait
2
3
Use trait in entity
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as Behaviors;
class SoftDeletableEntity
{
use Behaviors\SoftDeletable\SoftDeletable;
}
2
3
4
5
6
7
8
9
# Sortable
Enable behavior
nettrine.extensions.knplabs:
sortable: true
2
Or, if you want to add additional options
nettrine.extensions.knplabs:
sortable:
trait: YourSortableTrait
2
3
Use trait in entity
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as Behaviors;
class SortableEntity
{
use Behaviors\Sortable\Sortable;
}
2
3
4
5
6
7
8
9
Use trait in repository
use Doctrine\ORM\EntityRepository;
use Knp\DoctrineBehaviors\ORM as Behaviors;
final class SortableRepository extends EntityRepository
{
use Behaviors\Sortable\SortableRepository;
}
2
3
4
5
6
7
8
9
# Timestampable (opens new window)
Enable behavior
nettrine.extensions.knplabs:
timestampable: true
2
Or, if you want to add additional options
nettrine.extensions.knplabs:
timestampable:
dbFieldType: datetime | datetimetz | timestamp | timestamptz | ... # default: datetime
trait: YourTimestampableTrait
2
3
4
Use trait in entity
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as Behaviors;
class TimestampableEntity
{
use Behaviors\Timestampable\Timestampable;
}
2
3
4
5
6
7
8
9
# Translatable
Enable behavior
nettrine.extensions.knplabs:
translatable: true
2
Or, if you want to add additional options
nettrine.extensions.knplabs:
translatable:
currentLocaleCallable: callable # returns current locale or null
defaultLocaleCallable: callable # returns default locale or null
translatableFetchMode: LAZY | EAGER | EXTRA_LAZY # default: LAZY
translationFetchMode: LAZY | EAGER | EXTRA_LAZY # default: LAZY
translatableTrait: YourTranslatableTrait
translationTrait: YourTranslationTrait
2
3
4
5
6
7
8
Use trait in entity
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as Behaviors;
class TranslatableEntity
{
use Behaviors\Translatable\Translatable;
}
2
3
4
5
6
7
8
9
# Tree (opens new window)
Enable behavior
nettrine.extensions.knplabs:
tree: true
2
Or, if you want to add additional options
nettrine.extensions.knplabs:
tree:
nodeTrait: YourTreeNodeTrait
2
3
Use trait in entity and implement interface
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as Behaviors;
class TreeEntity implements Behaviors\Tree\NodeInterface
{
use Behaviors\Tree\Node;
}
2
3
4
5
6
7
8
9
Use trait in repository
use Doctrine\ORM\EntityRepository;
use Knp\DoctrineBehaviors\ORM as Behaviors;
final class TreeRepository extends EntityRepository
{
use Behaviors\Tree\Tree;
}
2
3
4
5
6
7
8
9