5
respostas

Laravel - colocar o nome do produto (permalink) na url ao invés do id. Como fazer?

Olá pessoal, estou na aula 3 do curso de Laravel e vi que o instrutor usa o get para pegar o ID do produto. Até aí ok, pois cada produto tem um id único. Porém para acessar a página de detalhes deste produto, a url recebe como caminho o id do produto, ex: localhost:8000/produtos/mostra/1. Já pensando em boas práticas de permalink e SEO eu gostaria de deixar o nome do produto ou (permalink) para servir de complemento no caminho da url ex: localhost:8000/produtos/mostra/geladeira-inox Como devo fazer?

5 respostas

Oi Samuel, tudo bom?

Da mesma forma que o instrutor usa os parametros da url (no capitulo 4) para recuperar o id, você pode usa-los para recuperar o nome. Algo como:

Route::get('/produtos/mostra/{nome}', 'ProdutoController@mostra');

E para resgatar o valor, a mesma ideia:

public function mostra($nome){
// resto da action

Só toma cuidado para evitar characteres especiais na url, como o espaço =)

Na hora de buscar no banco, você precisará buscar pelo nome também, já que não temos o id mais:

    $resposta = DB::select('select * from produtos where nome = ?', [$nome]);

Nessa hora vai ser importanta garantir a unicidade do nome no seu banco. Para evitar dois retornos.

Qualquer problema é só falar.

Abraço e bons estudos.

Obrigado pela ajuda André. Eu imaginava que seria algo assim. Tentei fazer pelo nome mas aí ficou localhost:8000/produtos/mostra/Fogão claro que deu erro pelos caracteres, porém vejo que seria interessante termos na tabela do produto no banco um campo próprio para permalink (termo que me acostumei com uso do wordpress) que deve ser único, pois se tiver dois permalink com nomes iguais, preciso tratar no momento do cadastro do permalink como ex: geladeira-inox e outra geladeira como geladeira-inox-1.

Boa, gerar um campo desse no banco pode ajudar bastante na gestão dessa informação =)

Use esse aqui https://github.com/cviebrock/eloquent-sluggable, quando tiver mais familiaridade com Laravel.

Algo mais imediato e só pra brincar é usar o helper str_slug() https://laravel.com/docs/5.5/helpers#method-str-slug em uma coluna slug quando for salvar/editar o produto.

Olá Samuel,

Recomendo criar um campo chamado slug no seu banco de dados e ao criar um novo produto vc usa o helper do laravel

str_slug()

A migration ficarai mais ou menos assim

codigo anterior...
            $table->string('slug');
final do codigo...

Ao criar um novo produto

codigo anterior...
            'slug' => str_slug($request->nome),
final do codigo...

Usando só o slug vc ainda teria o problema de dois produtos com o mesmo nome ter o mesmo slug, por isso recomendo colocar o id antes do slug. Como ficaria o web.php:

Route::get('/produtos/mostra/{id}/{slug}'', 'SeuController@metodo')->name('nome.da.rota');

E vc receberia o id normalmente no seu controller:

public function metodo($id, $slug)
    {
        $produto= Produto::where('id', $id)->first();
    }

No final vc teria uma URL mais friendly localhost:8000/produtos/mostra/1/geladeira-inox . Se tiver outro geladeira inox (que vai ter outro dia), ficaria localhost:8000/produtos/mostra/35/geladeira-inox