2
votes

Route Laravel - Vérifiez si l'ID n'existe pas et affichez 404

Je ne veux pas afficher la page si l'ID n'existe pas.

Comment puis-je vérifier cela dans mes routes web.php dans Laravel?

J'ai actuellement la route suivante:

Route::get('/public/{project_id}', 'ProjectController@public');

Comment puis-je faire une vérification conditionnelle pour voir si project_id existe?

J'ai vu qu'il y avait une option pour Route :: bind dans la documentation de routage - est-ce une solution? Merci

Note de mise à jour: légèrement différente de l'approche Laravel 4 car la liaison semble avoir été intégrée à la classe de route.


0 commentaires

5 Réponses :


7
votes

Ce que vous voulez utiliser s'appelle Liaison de modèle d'itinéraire . Laravel fait ce que vous voulez hors de la boîte. Si l'ID n'est pas dans la base de données, il affiche une page 404. Cependant, vous devez changer votre itinéraire:

En supposant que votre modèle s'appelle Projet , l'itinéraire devrait ressembler à ceci:

public function public(Project $project) {

Et votre ProjectController devrait ressembler à ceci:

Route::get('/public/{project}', 'ProjectController@public');

De cette façon, Laravel résout automatiquement le projet avec l'ID que vous fournissez et l'injecte dans le $ project variable. Si aucun enregistrement avec l'identifiant n'existe, laravel redirige vers 404


1 commentaires

C'est bien. Cela signifie que je peux également nettoyer mon code dans mon contrôleur en n'utilisant pas Request $ request et utiliser simplement le modèle Project immédiatement. Merci pour l'aide!



2
votes

Ajout à la réponse de Patrick Schocke.

Si vous ne souhaitez pas utiliser Route Model Binding, vous pouvez explicitement vérifier le contrôleur

public function public($project_id) {
    $projectExists = Project::where('id', $project_id)->exists();

    abort_unless($projectExists, 404, 'Project not found');

   ...
    }
}


3 commentaires

Comme alternative, vous pouvez également utiliser la fonction d'aide Laravel abort comme abort (404, 'Project not found') pour supprimer le besoin de construire et de renvoyer la réponse. Ou pour supprimer également l'instruction conditionnelle, vous pouvez même utiliser abort_unless ($ projectExists, 404, 'Project not found') . Vous pouvez en savoir plus à ce sujet dans la Documentation Laravel .


@Bogdan Wow. Merci beaucoup pour ces conseils. Je n'étais pas au courant de ces fonctions d'aide Laravel.


Une autre option (en supposant que id était la clé primaire du modèle) serait d'utiliser findOrFail () . par exemple. Projet :: findOrFail ($ project_id) . Cela renvoie automatiquement un 404 si l'élément n'est pas trouvé.



0
votes

Vous pouvez vérifier si project_id n'existe pas puis renvoyer l'erreur 404 en appelant la fonction abort () .

  public function public($project_id) {
        $project_id_exist = Project::where('id', $project_id)->first();
        if(!$project_id_exist){
            return abort(404);
        }
    }


0 commentaires

1
votes

Vous pouvez y parvenir en utilisant la fonctionnalité de liaison de modèle de route laravel

votre route sera

public function public(Project $project) {
       // Do your work here using $project model
       //  If a matching model instance is not found in the database, a 404 HTTP response will automatically be generated. 
}

votre contrôleur sera

Route::get('/public/{project}', 'ProjectController@public');


0 commentaires

1
votes

Utilisez simplement la méthode findOrFail () de laravel. Cette méthode récupérera le premier résultat de la requête; cependant, si aucun résultat n'est trouvé, une réponse HTTP 404 est automatiquement envoyée.

public function public ($project_id) {
    $project = Project::findOrFail($project_id);
}

source: https://laravel.com/docs/5.8/eloquent#retrieving-single-models


0 commentaires