Este pacote fornece uma característica que irá gerar um slug exclusivo ao salvar qualquer modelo do Eloquent.
$model = new EloquentModel();$model->name = 'activerecord é incrível';$model->save();echo $model->slug; // gera "activerecord-is-awesome"
Os slugs são gerados com o método Laravels Str::slug
, onde os espaços são convertidos em '-'.
Spatie é uma agência de webdesign com sede em Antuérpia, Bélgica. Você encontrará uma visão geral de todos os nossos projetos de código aberto em nosso site.
Investimos muitos recursos na criação dos melhores pacotes de código aberto. Você pode nos apoiar comprando um de nossos produtos pagos.
Agradecemos muito que você nos envie um cartão postal de sua cidade natal, mencionando qual(is) de nossos pacotes você está usando. Você encontrará nosso endereço em nossa página de contato. Publicamos todos os cartões postais recebidos em nosso mural virtual de cartões postais.
Você pode instalar o pacote via compositor:
compositor requer spatie/laravel-sluggable
Seus modelos Eloquent devem usar a característica SpatieSluggableHasSlug
e a classe SpatieSluggableSlugOptions
.
A característica contém um método abstrato getSlugOptions()
que você mesmo deve implementar.
As migrações dos seus modelos devem ter um campo para salvar o slug gerado.
Aqui está um exemplo de como implementar a característica:
namespace App;use SpatieSluggableHasSlug;use SpatieSluggableSlugOptions;use IlluminateDatabaseEloquentModel;class YourEloquentModel estende o modelo {use HasSlug;/** * Obtenha as opções para gerar o slug. */função pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug'); } }
Com sua migração:
use IlluminateDatabaseMigrationsMigration;use IlluminateDatabaseSchemaBlueprint;use IlluminateSupportFacadesSchema;class CreateYourEloquentModelTable estende a migração {função pública ativa() { Schema::create('your_eloquent_models', function (Blueprint $table) {$table->increments('id');$table->string('slug'); // Nome do campo igual ao da sua `saveSlugsTo`$table ->string('nome');$tabela->timestamps(); }); } }
Para usar o slug gerado nas rotas, lembre-se de usar a ligação implícita do modelo de rota do Laravel:
namespace App;use SpatieSluggableHasSlug;use SpatieSluggableSlugOptions;use IlluminateDatabaseEloquentModel;class YourEloquentModel estende o modelo {use HasSlug;/** * Obtenha as opções para gerar o slug. */função pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug'); }/** * Obtenha a chave de rota do modelo. * * @return string */função pública getRouteKeyName() {retornar 'lesma'; } }
Quer usar vários campos como base para um slug? Sem problemas!
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom(['primeiro_nome', 'sobrenome']) ->saveSlugsTo('slug'); }
Você também pode passar um callable
para generateSlugsFrom
.
Por padrão, o pacote irá gerar slugs exclusivos anexando '-' e um número a um slug que já existe.
Você pode desabilitar esse comportamento chamando allowDuplicateSlugs
.
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->allowDuplicateSlugs(); }
Você também pode definir um limite máximo de tamanho para o slug criado:
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->slugsShouldBeNoLongerThan(50); }
O slug pode ser um pouco maior que o valor especificado, devido ao sufixo que é adicionado para torná-lo único.
Você também pode usar um separador personalizado chamando usingSeparator
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->usandoSeparator('_'); }
Para definir o idioma usado por Str::slug
você pode chamar usingLanguage
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->usandoIdioma('nl'); }
Você também pode substituir o slug gerado apenas definindo-o com um valor diferente do slug gerado.
$model = EloquentModel::create(['nome' => 'meu nome']); //slug agora é "meu-nome";$model->slug = 'my-custom-url';$model->save(); //slug agora é "my-custom-url";
Se não quiser criar o slug quando o modelo tiver um estado, você pode usar a função skipGenerateWhen
.
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->skipGenerateWhen(fn() => $this->state === 'rascunho'); }
Se você não deseja criar o slug quando o modelo é criado inicialmente, você pode definir o uso da função doNotGenerateSlugsOnCreate()
.
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnCreate(); }
Da mesma forma, se você quiser evitar que o slug seja atualizado nas atualizações do modelo, chame doNotGenerateSlugsOnUpdate()
.
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnUpdate(); }
Isso pode ser útil para criar links permanentes que não mudam até que você queira explicitamente.
$model = EloquentModel::create(['nome' => 'meu nome']); //slug agora é "meu-nome";$model->save();$model->name = 'nome alterado';$model->save(); //slug permanece "meu-nome"
Se você deseja atualizar explicitamente o slug no modelo, você pode chamar generateSlug()
no seu modelo a qualquer momento para fazer o slug de acordo com suas outras opções. Não se esqueça de save()
o modelo para persistir a atualização em seu banco de dados.
Você pode evitar que os slugs sejam substituídos.
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->preventOverwrite(); }
Se você possui um escopo global que deve ser levado em consideração, você também pode defini-lo com extraScope
. Por exemplo, se você tiver uma tabela de páginas contendo páginas de vários sites e cada site tiver seus próprios slugs exclusivos.
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); }
Por padrão, o índice do sufixo começa em 1, você pode definir o número inicial.
função pública getSlugOptions(): SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug') ->startSlugSuffixFrom(2); }
Você pode usar este pacote junto com laravel-translatable para gerar um slug para cada localidade. Em vez de usar a característica HasSlug
, você deve usar a característica HasTranslatableSlug
e adicionar o nome do campo slug ao array $translatable
. Para slugs gerados a partir de um único campo ou de vários campos, não é necessário alterar mais nada.
namespace App;use SpatieSluggableHasTranslatableSlug;use SpatieSluggableSlugOptions;use SpatieTranslatableHasTranslations;use IlluminateDatabaseEloquentModel;class YourEloquentModel estende o modelo {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Obtenha as opções para gerar o slug. */função pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug'); } }
Para slugs gerados a partir de um callable, você precisa instanciar SlugOptions
com o método createWithLocales
. O callable agora leva dois argumentos em vez de um. Tanto o $model
quanto o $locale
estão disponíveis para gerar um slug.
namespace App;use SpatieSluggableHasTranslatableSlug;use SpatieSluggableSlugOptions;use SpatieTranslatableHasTranslations;use IlluminateDatabaseEloquentModel;class YourEloquentModel estende o modelo {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Obtenha as opções para gerar o slug. */função pública getSlugOptions() : SlugOptions{return SlugOptions::createWithLocales(['en', 'nl']) ->generateSlugsFrom(function($model, $locale) {return "{$locale} {$model->id}"; }) ->saveSlugsTo('slug'); } }
Você também pode usar a ligação do modelo de rota implícita do Laravel dentro do seu controlador para resolver automaticamente o modelo. Para usar esse recurso, certifique-se de que a coluna slug corresponda a routeNameKey
.
Atualmente, apenas alguns tipos de banco de dados oferecem suporte a operações JSON. Mais informações sobre quais bancos de dados suportam JSON podem ser encontradas na documentação do Laravel.
namespace App;use SpatieSluggableHasSlug;use SpatieSluggableSlugOptions;use IlluminateDatabaseEloquentModel;class YourEloquentModel estende o modelo {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Obtenha as opções para gerar o slug. */função pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nome') ->saveSlugsTo('slug'); }/** * Obtenha a chave de rota do modelo. * * @return string */função pública getRouteKeyName() {retornar 'lesma'; } }
Por conveniência, você pode usar o alias findBySlug
para recuperar um modelo. A consulta será comparada com o campo passado para saveSlugsTo
ao definir SlugOptions
.
$model = Artigo::findBySlug('meu-artigo');
findBySlug
também aceita um segundo parâmetro $columns
assim como o método find
padrão do Eloquent.
Consulte CHANGELOG para obter mais informações sobre o que mudou recentemente.
teste de compositor
Consulte CONTRIBUINDO para obter detalhes.
Se você encontrou um bug relacionado à segurança, envie um email para [email protected] em vez de usar o rastreador de problemas.
Freek Van der Herten
Todos os colaboradores
A licença MIT (MIT). Consulte Arquivo de licença para obter mais informações.