name; * * Or it can be an array of fields, like ("name", "company"), which builds a slug from: * * $model->name . ' ' . $model->company; * * If you've defined custom getters in your model, you can use those too, * since Eloquent will call them when you request a custom attribute. * * Defaults to null, which uses the toString() method on your model. */ 'source' => null, /** * The maximum length of a generated slug. Defaults to "null", which means * no length restrictions are enforced. Set it to a positive integer if you * want to make sure your slugs aren't too long. */ 'maxLength' => null, /** * If you are setting a maximum length on your slugs, you may not want the * truncated string to split a word in half. The default setting of "true" * will ensure this, e.g. with a maxLength of 12: * * "my source string" -> "my-source" * * Setting it to "false" will simply truncate the generated slug at the * desired length, e.g.: * * "my source string" -> "my-source-st" */ 'maxLengthKeepWords' => true, /** * If left to "null", then use the cocur/slugify package to generate the slug * (with the separator defined below). * * Set this to a closure that accepts two parameters (string and separator) * to define a custom slugger. e.g.: * * 'method' => function( $string, $sep ) { * return preg_replace('/[^a-z]+/i', $sep, $string); * }, * * Otherwise, this will be treated as a callable to be used. e.g.: * * 'method' => array('Str','slug'), */ 'method' => function($string, $separator = '-') { $_transliteration = array( '/ä|æ|ǽ/' => 'ae', '/ö|œ/' => 'oe', '/ü/' => 'ue', '/Ä/' => 'Ae', '/Ü/' => 'Ue', '/Ö/' => 'Oe', '/À|Á|Â|Ã|Å|Ǻ|Ā|Ă|Ą|Ǎ/' => 'A', '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/' => 'a', '/Ç|Ć|Ĉ|Ċ|Č/' => 'C', '/ç|ć|ĉ|ċ|č/' => 'c', '/Ð|Ď|Đ/' => 'D', '/ð|ď|đ/' => 'd', '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/' => 'E', '/è|é|ê|ë|ē|ĕ|ė|ę|ě/' => 'e', '/Ĝ|Ğ|Ġ|Ģ/' => 'G', '/ĝ|ğ|ġ|ģ/' => 'g', '/Ĥ|Ħ/' => 'H', '/ĥ|ħ/' => 'h', '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ/' => 'I', '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/' => 'i', '/Ĵ/' => 'J', '/ĵ/' => 'j', '/Ķ/' => 'K', '/ķ/' => 'k', '/Ĺ|Ļ|Ľ|Ŀ|Ł/' => 'L', '/ĺ|ļ|ľ|ŀ|ł/' => 'l', '/Ñ|Ń|Ņ|Ň/' => 'N', '/ñ|ń|ņ|ň|ʼn/' => 'n', '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/' => 'O', '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/' => 'o', '/Ŕ|Ŗ|Ř/' => 'R', '/ŕ|ŗ|ř/' => 'r', '/Ś|Ŝ|Ş|Ș|Š/' => 'S', '/ś|ŝ|ş|ș|š|ſ/' => 's', '/Ţ|Ț|Ť|Ŧ/' => 'T', '/ţ|ț|ť|ŧ/' => 't', '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/' => 'U', '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/' => 'u', '/Ý|Ÿ|Ŷ/' => 'Y', '/ý|ÿ|ŷ/' => 'y', '/Ŵ/' => 'W', '/ŵ/' => 'w', '/Ź|Ż|Ž/' => 'Z', '/ź|ż|ž/' => 'z', '/Æ|Ǽ/' => 'AE', '/ß/' => 'ss', '/IJ/' => 'IJ', '/ij/' => 'ij', '/Œ/' => 'OE', '/ƒ/' => 'f' ); $quotedReplacement = preg_quote($separator, '/'); $merge = array( '/[^\s\p{Zs}\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ', '/[\s\p{Zs}]+/mu' => $separator, sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => '', ); $map = $_transliteration + $merge; unset($_transliteration); return mb_strtolower(preg_replace(array_keys($map), array_values($map), $string)); }, /** * Separator to use when generating slugs. Defaults to a hyphen. */ 'separator' => '-', /** * Enforce uniqueness of slugs? Defaults to true. * If a generated slug already exists, an incremental numeric * value will be appended to the end until a unique slug is found. e.g.: * * my-slug * my-slug-1 * my-slug-2 */ 'unique' => true, /** * If you are enforcing unique slugs, the default is to add an * incremental value to the end of the base slug. Alternatively, you * can change this value to a closure that accepts three parameters: * the base slug, the separator, and a Collection of the other * "similar" slugs. The closure should return the new unique * suffix to append to the slug. */ 'uniqueSuffix' => null, /** * Should we include the trashed items when generating a unique slug? * This only applies if the softDelete property is set for the Eloquent model. * If set to "false", then a new slug could duplicate one that exists on a trashed model. * If set to "true", then uniqueness is enforced across trashed and existing models. */ 'includeTrashed' => false, /** * An array of slug names that can never be used for this model, * e.g. to prevent collisions with existing routes or controller methods, etc.. * Defaults to null (i.e. no reserved names). * Can be a static array, e.g.: * * 'reserved' => array('add', 'delete'), * * or a closure that returns an array of reserved names. * If using a closure, it will accept one parameter: the model itself, and should * return an array of reserved names, or null. e.g. * * 'reserved' => function( Model $model) { * return $model->some_method_that_returns_an_array(); * } * * In the case of a slug that gets generated with one of these reserved names, * we will do: * * $slug .= $separator + "1" * * and continue from there. */ 'reserved' => null, /** * Whether to update the slug value when a model is being * re-saved (i.e. already exists). Defaults to false, which * means slugs are not updated. * * Be careful! If you are using slugs to generate URLs, then * updating your slug automatically might change your URLs which * is probably not a good idea from an SEO point of view. * Only set this to true if you understand the possible consequences. */ 'onUpdate' => false, ];