【问题标题】:Laravel 8 routes - getting 404 but route is listed in PHP artisan route:listLaravel 8 路线 - 得到 404 但路线列在 PHP artisan route:list
【发布时间】:2021-09-14 00:22:21
【问题描述】:

我在 laravel 8 中遇到了这个问题,我添加的新路由立即给了我 404,但是当我使用 PHP artisan route: list they are shown: here my routes

// Rutas de vistas públicas
Route::group(['prefix' => '/mx/capitulos'], function(){

    // vista publica que regresa cuando es autenticada desde link dinamico
    Route::any('/vp/{id_user}', function ($id_user) {

        $user = Cargo::where('id_usuario', '=', $id_user)->orderBy('id_puesto', 'asc')->first();
        $capitulo = Capitulo::where('id_capitulo', '=', $user->id_capitulo)->first();

        if($capitulo == null){
            abort(401);
        }

        return view('vp_main')->with([
            'id_capitulo' => $capitulo->id_capitulo,
            'nombre_capitulo' => $capitulo->nombre_capitulo,
            'id_usuario' => $user->id_usuario,
        ]);

    })->name('vp_usuarios');

    // rutas para autenticacion de link dinamico
    Route::any('/auth/{url_token}/{id_user}', function (Request $request, $url_token, $id_user) {

        $token_admin = new TokenController;
        return $token_admin->abrirVentanillaPagos($request, $url_token, $id_user);

    })->name('vp_entrada');

    // vista que busca el nombre del capitulo escrito en el navegador
    Route::get('/{nombre_cap?}/{id_usuario?}', function ($nombre_cap = null) {

        $capitulo = Capitulo::where('nombre_capitulo', 'like', '%'. $nombre_cap .'%')->first();

        if($capitulo == null && $nombre_cap == 'ventanilla_pagos'){

            $nombre_capitulo = "Ventanilla de Pago - Capitulos";
            return view('vp_main')->with('nombre_capitulo', $nombre_capitulo);

        } elseif($capitulo !== null ) {

            return view('vp_main')->with([
                'id_capitulo' => $capitulo->id_capitulo,
                'nombre_capitulo' => $capitulo->nombre_capitulo,
            ]);

        } else {
            abort(404);
        }
    })->name('vp_capitulo');

    // redireccion a la segunda vista para efectuar el pago
    Route::any('/vp/completar_pago/{id_capitulo}', function ($id_capitulo) {

        return view('vp_completar')->with(['id_capitulo' => $id_capitulo]);

    })->name('vp_completar');

});

和我的路线:列表结果

| GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | mx/capitulos/auth/{url_token}/{id_user}      | vp_entrada            | Closure
                                                   | web                                             |
|        | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | mx/capitulos/vp/completar_pago/{id_capitulo} | vp_completar          | Closure
                                                   | web                                             |
|        | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | mx/capitulos/vp/{id_user}                    | vp_usuarios           | Closure
                                                   | web                                             |
|        | GET|HEAD                               | mx/capitulos/{nombre_cap?}/{id_usuario?}     | vp_capitulo           | Closure
                                                   | web                                             |

| |

其余路线运行良好,只是我列出的那些是抛出 404 页面的路线。没有可用的日志。任何帮助将不胜感激。提前致谢

【问题讨论】:

  • 使用控制器编写函数
  • 显示你的网址,你输入的网址正确吗? (如果您没有任何错误,请清除缓存)
  • 完整网址为:code.regionadmin.com/mx/capitulos/ventanilla_pagos。我已清除缓存并优化:清除但现在它删除了我所有的 sass 样式:(
  • 这些功能之所以存在是因为它们检查用户是否输入了团队名称并根据该名称进行重定向
  • 您的 URL 在 route:list 结果中没有路由。

标签: php laravel laravel-8


【解决方案1】:

我在这里看到的问题可能与这条路线有关

//any two parameter will match these parameter and it will execute.
 //the number of parameter does not matter
     Route::get('/{nombre_cap?}/{id_usuario?}', function ($nombre_cap = null) {
    
            $capitulo = Capitulo::where('nombre_capitulo', 'like', '%'. $nombre_cap .'%')->first();
    
            if($capitulo == null && $nombre_cap == 'ventanilla_pagos'){
    
                $nombre_capitulo = "Ventanilla de Pago - Capitulos";
                return view('vp_main')->with('nombre_capitulo', $nombre_capitulo);
    
            } elseif($capitulo !== null ) {
    
                return view('vp_main')->with([
                    'id_capitulo' => $capitulo->id_capitulo,
                    'nombre_capitulo' => $capitulo->nombre_capitulo,
                ]);
    
            } else {
                abort(404);
            }
        })->name('vp_capitulo');

路由中有两个可选参数,没有强制参数,所以任何来的东西都会匹配到这个路由,这将执行路由,并且路由永远不会搜索下一个路由,因为它有一个匹配的参数。

例如...当您调用此路由时,它仍将执行上述路由,因为它与上述路由匹配,这可能导致 404 错误,因为它找不到结果。

//vp becomes first parameter for {nombre_cap?} and completar_pago will become the second parameter for {id_usuario?}.
//it will never look for third parameter once it has found its match

    Route::any('/vp/completar_pago/{id_capitulo}', function ($id_capitulo) {
        
                return view('vp_completar')->with(['id_capitulo' => $id_capitulo]);
        
            })->name('vp_completar');

您在给定前缀组中添加的任何新路由都会发生类似情况。您可以做的一件事是将上述带有可选参数的路由移到最后,因为该路由仅在没有其他路由匹配该参数时才会执行。

【讨论】:

  • 不客气。感谢您的支持。快乐编码:)
【解决方案2】:

运行php artisan route:cache

Link to route caching docs

【讨论】:

  • 谢谢,它帮助我补充了上面的答案
猜你喜欢
  • 2020-04-05
  • 1970-01-01
  • 2017-05-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2018-10-04
相关资源
最近更新 更多