Implementation for Doctrine2 sluggable behaviour for Symfony entities
The DoctrineSluggableBundle provides a neat implementation for Doctrine2 sluggable behaviour for your entities., (*1)
The DoctrineSluggableBundle takes care of ensuring your slugs generated for your entity are unique. Simply have your entity implement the SluggableInterface interface your entities will automatically have slugs generated., (*2)
This uses the service container and dependency injection which allows you to easily create your own "Slugger" class. This supports you creating custom slugs to suit your domain problem., (*3)
This documentation is still under construction. However, an example is provided for any interested parties to begin experimenting with the package., (*4)
Simply run assuming you have installed composer.phar or composer binary :, (*5)
$ php composer.phar require samj/doctrine-sluggable-bundle 2.0
Then add this in app/AppKernel.php
:, (*6)
new SamJ\DoctrineSluggableBundle\SamJDoctrineSluggableBundle(),
In this example, the slug is built based on a single field: Note: Make sure you implement the accessor methods getId and getTitle, (*7)
<?php // --- YOUR NAMESPACE HERE --- namespace SamJ\ExampleBundle\Entity; use SamJ\DoctrineSluggableBundle\SluggableInterface; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table */ class SingleFieldExample implements SluggableInterface { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue */ protected $id; /** * @ORM\Column(type="string") */ protected $title; /** * @ORM\Column(type="string") */ protected $slug; // Implement methods for $id, $title, etc public function getSlug() { return $this->slug; } public function setSlug($slug) { if (!empty($this->slug)) return false; $this->slug = $slug; } public function getSlugFields() { return $this->getTitle(); } }
When the entity is persisted, the $slug field will be populated to be a 0-9, a-z only, with spaces converted to hyphens ("-"), based upon the title field., (*8)
i.e.: an entity with a title of Test Post
will have a slug of test-post
., (*9)
In this example, the slug is built based on multiple single fields: Note: Make sure you implement the accessor methods getId, getTitle and getAuthor, (*10)
<?php // --- YOUR NAMESPACE HERE --- namespace SamJ\ExampleBundle\Entity; use SamJ\DoctrineSluggableBundle\SluggableInterface; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table */ class MultipleSingleFieldExample implements SluggableInterface { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue */ protected $id; /** * @ORM\Column(type="string") */ protected $title; /** * @ORM\Column(type="string") */ protected $author; /** * @ORM\Column(type="string") */ protected $slug; // Implement methods for $id, $title, $author, etc public function getSlug() { return $this->slug; } public function setSlug($slug) { if (!empty($this->slug)) return false; $this->slug = $slug; } public function getSlugFields() { return array($this->getAuthor(), $this->getTitle()); } }
When the entity is persisted, the $slug field will be populated to be a 0-9, a-z only, with spaces converted to hyphens ("-"), based upon the author and title field., (*11)
i.e.: an entity with a author of Sam Jarrett
and a title of Test Post
will have a slug of sam-jarrett-test-post
., (*12)
This bundle uses a service called the "Slugger". You can implement your own slugger behaviour (such as dealing with specific field ordering etc) by implementing the SluggerInterface->getSlug($fields) method. Configure your service container to specific the class in the parameter "sluggable.slugger.class" in your service.xml., (*13)