1
votes

Remplacement de l'ID d'objet par le nom de l'objet sur l'URL sur la route Laravel

J'essaie de rendre mon URL plus conviviale pour le référencement sur mon application Laravel en remplaçant le numéro d'identification d'un certain objet par le nom sur l'URL lorsque je vais sur cette page d'exposition de registre spécifique. Tout le monde sait comment?

Voici ce que j'ai obtenu jusqu'à présent et il affiche, comme d'habitude, l'identifiant comme dernier paramètre de l'URL:

web.php

<a href="{{route('website.job.show', $job->id)}}">{{$job->name}}</a>


0 commentaires

3 Réponses :


1
votes

Il vous suffit de remplacer id par le nom :

<a href="{{route('website.job.show', $job->name)}}">{{$job->name}}</a>

Dans l'action du contrôleur:

public function show($name){
    //Make sure to replace the 'name' string with the column name in your DB
    $job = Job::where('name', $name)->first();
    return view('website.job')->with(compact('job'));
}

Enfin dans la page Blade:

Route::get('/job/show/{name}', ['as'=>'website.job.show','uses'=>'HomeController@show']);


3 commentaires

Merci Zakaria. Le problème avec cette solution serait 2 emplois avec le même nom de titre dans la base de données, non?


Oui, cela peut arriver, si vous avez besoin d'une valeur unique, vous devez utiliser id ou vous pouvez utiliser les deux comme une combinaison id-name .


Avez-vous besoin d'un échantillon utilisant la combinaison des deux valeurs comme / job / show / 1-name_here



2
votes

Vous pouvez écraser le nom de clé de votre modèle Job :

public function show(Job $job)
{
    return view('website.job')
        ->with(compact('job'));
}

Ensuite, dans votre itinéraire, utilisez simplement {job} :

<a href="{{ route('website.jobs.show', $job) }}">{{ $job->name }}</a>

Et pour appeler votre route:

route('website.job.show', $job);

Ainsi, votre balise a ressemblerait à ceci :

Route::get('/job/show/{job}', ...);

Dans votre contrôleur, vous pouvez modifier la signature de la méthode pour recevoir automatiquement le Job:

public function getRouteKeyName()
{
    return 'name';
}

Pour plus d'informations , regardez la personnalisation du nom de la clé sous la liaison implicite: https://laravel.com/docs /5.8/routing#implicit-binding


4 commentaires

Et comment cela fonctionnerait-il avec le tag a? Je passe le travail-> Id?


Non, vous passez simplement l'instance de travail comme dans l'itinéraire.


@LuizWynne Regardez ma réponse mise à jour. Je montre un exemple avec le tag a.


Je vais essayer ça. Merci beaucoup!!



0
votes

2 options:

1) l'une est comme @ zakaria-acharki a écrit dans son commentaire, par le nom de l'emploi et la recherche par le nom pour récupérer les données

2) la seconde est pour le faire comme ici dans stackoverflow

pour créer l'url avec l'identifiant / le nom

de cette manière, vous vous assurerez de récupérer et d'afficher l'objet de travail pertinent par l'ID unique

la route:

<a href="{{route('website.job.show', $job->id, $job->name)}}">{{$job->name}}</a>

dans le contrôleur, mettre à jour la vérification si le nom est égal au nom du travail (au cas où il aurait été changé) pour éviter les doublons URL des pages

public function show($id, $name){
    $job = Job::findOrFail($id);

    // check here if( $job->name != $name ) {
    // redirect 301 to url with the new name
    // }

    return view('website.job')->with(compact('job'));
}

dans le fichier blade.php:

Route::get('/job/show/{id}/{name}', ['as'=>'website.job.show','uses'=>'HomeController@show']);


2 commentaires

La première option récupérait plusieurs travaux portant le même nom dans la base de données, et la seconde ne fonctionnait pas réellement lorsque j'ai essayé


Génial, c'est aussi mon option préférée et je l'utilise depuis longtemps. Vous êtes invités à voter :)