Salut à vous,

Je viens poster ma question ici car j'ai un petit soucis de routes (uniquement en production d'ailleurs, pas en local). J'ai certaines routes qui ne fonctionnent plus, étant écrasées, par une généraliste. Un exemple sera plus parlant :

    // j'ai toutes sortes de routes du type mon-compte/nouveau-compte.php etc...
    // et tout à la fin, j'ai deux routes (qui apparaissent en dernières de ma liste de routes) comme ceci :
    //  Articles d'une catégorie
Route::get('{cat}', ['uses' => 'CategoriesController@show', 'as' => 'categories.show']);

//  Vue d'un article
Route::get('{cat}/{article}.php', ['uses' => 'ArticlesController@show', 'as' => 'articles.show'])->where(['cat' => '[a-z0-9\-\_]+', 'article' => '[a-z0-9\-\_]+']);

Le soucis c'est que la dernière englobe dorénavant toutes les routes ayant à peu près la même architecture. Y aurait-il un moyen de faire en sorte que cette route ne soit pas prioritaire ? Qu'elle intéragisse en dernier cas de figure ?

Je précise également que j'utilise le package de module cafeine

Merci à vous =)

5 réponses


Alexandre #lbac
Auteur
Réponse acceptée

L'erreur venait en fait de cafeinated/modules... Lors de la mise en prod la priorité des modules a changé, et comme avec ce package il est impossible de déterminer la priorité des modules je suis parti sur ping-pong/modules (qui lui le permet), voilà quelques heures de perdues à cause d'un mauvais choix de package. Ca me servira de leçon.

Hello,

Je me suis heurté au même soucis.
La solution ? Placer cette route en dernier dans ta liste.
Je n'ai rien d'autre à te dire :P

Salut,

Justement, cette route est déjà placée à la fin :/

Voici ma liste de routes dans les très grandes lignes (très bref résumé de ma liste de routes dans l'ordre, {cat}/{article}.php étant la dernière route) :

|        | GET|HEAD                       | mon-compte                                         | auth.index                  | App\Bundles\User\Http\Controllers\AuthController@index                         |                       |
|        | GET|HEAD                       | utilisateurs                                       | users.index                 | App\Bundles\User\Http\Controllers\UsersController@index                        |                       |
|        | GET|HEAD                       | {cat}                                              | categories.show             | App\Bundles\Article\Http\Controllers\CategoriesController@show                 |                       |
|        | GET|HEAD                       | {cat}/{article}.php                                | articles.show               | App\Bundles\Article\Http\Controllers\ArticlesController@show                   |                       |

Et l'adresse mon-compte ou mon-compte/ essaye de pointer sur une catégorie, de même pour utilisateurs et utilisateurs/

Oui, mais d'après tes routes, tu n'as pas de mon-compte/{id} ?
Donc c'est normal qu'il te redirige sur la route {cat} ! Idem pour utilisateurs/{id}.
Si tu créer une route utilisateurs/{user_id}, la ta route {cat}/{article} restera à sa place.

Donc ce que j'aurais fait, je laisse comme ça, mais dans mon ArticlesController@show, si la catégorie n'existe pas (mon-compte par exemple) alors, abort(404).

Ca pose juste problème quand si tu va avoir une catégorie "mon-compte".

Salut,

En fait il y a plusieurs niveau :

  • utilisateurs : retourne la liste des utilisateurs
  • utilisateurs/{user_id} : un utilisateur

pour le mon compte, je ne trouve pas utile de placer l'id derrière, sachant que la route est placée devant.

En fait le soucis est que je dois conserver les anciennes urls (pour le référencement), je ne peux donc pas modifier les routes existantes. Malheureusement mon ArticlesController@show est assez générique, dans le sens ou {cat} peut être égal à une catégorie, mais aussi à un slug de tag si il n'y a rien derrière. Voici comment il se comporte :

$category = $this->categoryRepository->findBySlug($cat);

        //  S'il ne s'agit pas d'une catégorie il se peut qu'il s'agisse d'une page...
        if( !$category ) {
            $controller = app()->make(SiteController::class);
            $controller->action('page', ['page' => $cat]);
        }

        $tag = $this->tagRepository->findBySlug($slug);

        if( !$tag ) {
            $article = $this->articleRepository->query()
                ->with('medias', 'tags', 'user', 'commentsCount', 'category')
                ->published()
                ->enabled()
                ->where('slug', $slug)
                ->firstOrFail();
        } else {
            //  Je traite les tags
        }

        if( is_object($article) ) {
            return $this->displayArticle($article, $article->category);
        }

        return view('article::categories.show')->with('articles', $articles);