slug = $slug; return $this; } /** * Returns the entity's slug. * * @return string */ public function getSlug() { return $this->slug; } /** * @param $values * @return mixed|string */ private function generateSlugValue($values) { $usableValues = []; foreach ($values as $fieldName => $fieldValue) { if (!empty($fieldValue)) { $usableValues[] = $fieldValue; } } if (count($usableValues) < 1) { throw new \UnexpectedValueException( 'Sluggable expects to have at least one usable (non-empty) field from the following: [ ' . implode(array_keys($values), ',') .' ]' ); } // generate the slug itself $sluggableText = implode(' ', $usableValues); $transliterator = new Transliterator; $sluggableText = $transliterator->transliterate($sluggableText, $this->getSlugDelimiter()); $urlized = strtolower( trim( preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $sluggableText ), $this->getSlugDelimiter() ) ); $urlized = preg_replace("/[\/_|+ -]+/", $this->getSlugDelimiter(), $urlized); return $urlized; } /** * Generates and sets the entity's slug. Called prePersist and preUpdate */ public function generateSlug() { if ( $this->getRegenerateSlugOnUpdate() || empty( $this->slug ) ) { $fields = $this->getSluggableFields(); $values = []; foreach ($fields as $field) { if (property_exists($this, $field)) { $val = $this->{$field}; } else { $methodName = 'get' . ucfirst($field); if (method_exists($this, $methodName)) { $val = $this->{$methodName}(); } else { $val = null; } } $values[] = $val; } $this->slug = $this->generateSlugValue($values); } } }