【问题标题】:Laravel 3.x Route issue: page not found even with the route setLaravel 3.x 路由问题:即使设置了路由也找不到页面
【发布时间】:2013-06-26 17:39:15
【问题描述】:

对于我正在开发的 CMS 的一部分,我遇到了一个恼人的路由问题。 我得到了所有部分的路线,“产品”,例如:

    Route::get('admin/products', array('as' => 'admin/products', 'uses'=> 'admin.products@index'));
    Route::get('admin/products/create', array('as' => 'admin/products/create', 'uses'=> 'admin.products@create'));
    Route::get('admin/products/edit/(:num)', array('as' => 'admin/products/edit', 'uses'=> 'admin.products@edit'));
    Route::get('admin/products/delete/(:num)', array('as' => 'admin/products/delete', 'uses'=> 'admin.products@delete'));

.. 以及相关文件,如产品控制器、产品模型和视图。

在我决定创建一个新部分“用户”之前,一切都做得很好。我使用与“产品”相同的方法,创建路线和其他文件。事实上,我只是复制和粘贴文件,在需要时进行更改——非常简单。通过访问“admin/users”和“admin/users/create”,它可以按预期工作。但我无法访问“/users/edit/1”和“/users/delete/1”。我以为是路由问题,但是当我测试路由文件时,甚至在到达路由之前就得到了 404。这是一个例子:

    Route::get('admin/users/edit/(:num)', function()
    {
        return "Holy Hell.";
    });

“Holy Hell”永远不会打印到屏幕上。

这是“用户”的配置:

    Route::get('admin/users', array('as' => 'admin/users', 'uses'=> 'admin.users@index'));
    Route::get('admin/users/edit/(:num)', array('as' => 'admin/users/edit/', 'uses'=> 'admin.users@edit'));
    Route::get('admin/users/create', array('as' => 'admin/users/create', 'uses'=> 'admin.users@create'));
    Route::get('admin/users/delete/(:num)', array('as' => 'admin/users/delete', 'uses'=> 'admin.users@delete'));

我注意到/检查的事情:

  • 用户列表所在的索引视图有一个“URL::to_route('admin/users/edit')”函数。我在屏幕上没有错误,所以 Laravel 知道路由 'admin/users/edit' 设置正确。
  • 我知道这不是一般问题,因为其他 CMS 部分的“编辑”和“删除”方法没有问题。
  • 这些方法的视图在那里。所以这不是“找不到文件”的问题。

我想知道我是否在这里遗漏了一些非常明显的东西。有任何想法吗?如果没有,有人能告诉我如何调试吗?

非常感谢。

【问题讨论】:

    标签: php routes laravel laravel-3


    【解决方案1】:

    编辑:注意

    您的路线顺序不正确。反转它们。路由是自上而下评估的,因此路由中带有 admin/products 的任何内容都将路由到 admin.products@index 而没有其他内容。

    在您的edit 方法中,您需要定义id 参数。

    由于您没有发布您的控制器,我假设这就是原因,因为闭包没有将 $id 传递给它。示例:

    // Required user id:
    Route::get('admin/users/edit/(:num)', function($id)
    {
      return "Holy Hell.";
    });
    
    // Optional user id:
    Route::get('admin/users/edit/(:num?)', function($id = null)
    {
      return "Holy Hell.";
    });
    

    在您的情况下,您可能不想要可选部分,除非您打算抛出错误(或在错误时重定向)。

    【讨论】:

    • 我不认为是这样,路由应该仍然运行闭包只是不会传递任何参数。这是一个很好的建议,但我怀疑它能否解决 OP 问题。 编辑但是是的,您对路线排序是正确的
    • @Rob W 谢谢。我按照您的建议更改了我宣布路线的顺序。现在一切都很好。
    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2018-12-04
    • 2022-07-18
    • 2016-11-15
    • 2016-10-20
    • 2020-04-12
    相关资源
    最近更新 更多