J'ai les itinéraires suivants à Laravel. Je veux pouvoir appeler les deux pays ainsi que les pages à la "racine" du domaine, sans aucun préfixe de répertoire.
Ce que je veux, c'est que quand aucune page n'est trouvée dans le modèle éloquent, il essaie pour ouvrir le pays et si cela échoue également, montrez un 404.
Est-ce possible et que dois-je changer?
Route::get('/{page}', 'PageController@view')->name('pages.view');
Route::get('/{country}', 'CountryController@view')->name('countries.view');
Modifier : Je pense que j'étais un peu flou.
Le problème est que la route countries.view n'est jamais atteinte car elle échoue auparavant avec pages.view . Disons que j'appelle / germany - cela correspond d'abord à la route pages.view mais aucune page allemagne n'existe. Il lance immédiatement un 404 mais je veux qu'il vérifie le pays après cela et n'échoue que si / germany n'existe pas en tant que pays également.
3 Réponses :
Il y a plusieurs façons dont je vais mentionner deux façons:
1- Liaison de modèle de route: fonction de création du contrôleur de page à l'intérieur
public function view($page){
$check= Page::find($page);
if(!$check) abort(404);
}
cette fonction retournera introuvable si la page n'existe pas
2- Vérification normale:
public function view(Page $page){
}
Je suis désolé, je pense que je ne savais pas trop ce que je voulais. Le problème est que la route "country.view" n'est jamais atteinte car elle échoue auparavant avec "pages.view". Disons que j'appelle / germany - il correspond d'abord à la route "pages.view" mais aucune page "germany" n'existe. Il lance immédiatement un 404 mais je veux qu'il vérifie le pays après cela et n'échoue que si / l'Allemagne n'existe pas en tant que pays également.
créez le dossier resources / views / errors / 404.blade.php et définissez le message d'erreur 404
Que diriez-vous d'être agnostique? une route, vous testez le paramètre, puis renvoyez le résultat correct.
Route::get('/{pageOrCountry}',function($pageOrCountry){
$page = App\Page::find($pageOrCountry);
if($page) return $page;
else $country = App\Country::find($pageOrCountry);
if($country) return $country;
else return redirect('404');
});
Je pense que les itinéraires tels que vous les avez définis actuellement sont assez ambigus. Laravel n'a aucun moyen de faire la distinction entre une requête / {page} et une requête / {country}. Je pense que ce qui fonctionnerait est une méthode dans un contrôleur où vous analysez le paramètre passé, décidez quoi en faire, puis redirigez vers la vue appropriée