【问题标题】:Laravel 5.2 routes not working properlyLaravel 5.2 路由无法正常工作
【发布时间】:2016-12-05 23:25:17
【问题描述】:

我是 Laravel 新手,我在路由类方面遇到了一些问题

这是我的 routes.php

Route::get('/', function () {
    return view('welcome');
});

Route::auth();

Route::get('/home', 'HomeController@index');

Route::resource('/dashboard', 'DashboardController');
Route::resource('/dashboard/users', 'DashboardUsersController');
Route::resource('/dashboard/posts', 'DashboardPostsController');

app.dev/dashboard/users/index
app.dev/dashboard/posts/index

我创建的每条路线都喜欢

Route::get('dashboard/users/import', function (){
    return 'Importing a user';
});

Route::get('dashboard/users', 'DashboardUsersController@getUsers');

我已经尝试了一些我在这里找到的建议,比如清理缓存、查看和路由但没有奏效,我的项目文件夹的权限是 777

这是我的 DashboardUsersController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

class DashboardUsersController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('admin.users.index');
    }


    public function getUsers()
    {
        return view('admin.users.index');
    }


    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('admin.users.index');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        return view('admin.users.index');
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

编辑 php artisan route:list

+--------+-----------+------------------------------+-------------------------+-----------------------------------------------------------------+------------+
| Domain | Method    | URI                          | Name                    | Action                                                          | Middleware |
+--------+-----------+------------------------------+-------------------------+-----------------------------------------------------------------+------------+
|        | GET|HEAD  | /                            |                         | Closure                                                         | web        |
|        | POST      | dashboard                    | dashboard.store         | App\Http\Controllers\DashboardController@store                  | web        |
|        | GET|HEAD  | dashboard                    | dashboard.index         | App\Http\Controllers\DashboardController@index                  | web        |
|        | GET|HEAD  | dashboard/create             | dashboard.create        | App\Http\Controllers\DashboardController@create                 | web        |
|        | POST      | dashboard/posts              | dashboard.posts.store   | App\Http\Controllers\DashboardPostsController@store             | web        |
|        | GET|HEAD  | dashboard/posts              | dashboard.posts.index   | App\Http\Controllers\DashboardPostsController@index             | web        |
|        | GET|HEAD  | dashboard/posts/create       | dashboard.posts.create  | App\Http\Controllers\DashboardPostsController@create            | web        |
|        | PUT|PATCH | dashboard/posts/{posts}      | dashboard.posts.update  | App\Http\Controllers\DashboardPostsController@update            | web        |
|        | DELETE    | dashboard/posts/{posts}      | dashboard.posts.destroy | App\Http\Controllers\DashboardPostsController@destroy           | web        |
|        | GET|HEAD  | dashboard/posts/{posts}      | dashboard.posts.show    | App\Http\Controllers\DashboardPostsController@show              | web        |
|        | GET|HEAD  | dashboard/posts/{posts}/edit | dashboard.posts.edit    | App\Http\Controllers\DashboardPostsController@edit              | web        |
|        | GET|HEAD  | dashboard/users              | dashboard.users.index   | App\Http\Controllers\DashboardUsersController@getUsers          | web        |
|        | POST      | dashboard/users              | dashboard.users.store   | App\Http\Controllers\DashboardUsersController@store             | web        |
|        | GET|HEAD  | dashboard/users/create       | dashboard.users.create  | App\Http\Controllers\DashboardUsersController@create            | web        |
|        | DELETE    | dashboard/users/{users}      | dashboard.users.destroy | App\Http\Controllers\DashboardUsersController@destroy           | web        |
|        | GET|HEAD  | dashboard/users/{users}      | dashboard.users.show    | App\Http\Controllers\DashboardUsersController@show              | web        |
|        | PUT|PATCH | dashboard/users/{users}      | dashboard.users.update  | App\Http\Controllers\DashboardUsersController@update            | web        |
|        | GET|HEAD  | dashboard/users/{users}/edit | dashboard.users.edit    | App\Http\Controllers\DashboardUsersController@edit              | web        |
|        | PUT|PATCH | dashboard/{dashboard}        | dashboard.update        | App\Http\Controllers\DashboardController@update                 | web        |
|        | DELETE    | dashboard/{dashboard}        | dashboard.destroy       | App\Http\Controllers\DashboardController@destroy                | web        |
|        | GET|HEAD  | dashboard/{dashboard}        | dashboard.show          | App\Http\Controllers\DashboardController@show                   | web        |
|        | GET|HEAD  | dashboard/{dashboard}/edit   | dashboard.edit          | App\Http\Controllers\DashboardController@edit                   | web        |
|        | GET|HEAD  | home                         |                         | App\Http\Controllers\HomeController@index                       | web,auth   |
|        | GET|HEAD  | login                        |                         | App\Http\Controllers\Auth\AuthController@showLoginForm          | web,guest  |
|        | POST      | login                        |                         | App\Http\Controllers\Auth\AuthController@login                  | web,guest  |
|        | GET|HEAD  | logout                       |                         | App\Http\Controllers\Auth\AuthController@logout                 | web        |
|        | POST      | password/email               |                         | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | web,guest  |
|        | POST      | password/reset               |                         | App\Http\Controllers\Auth\PasswordController@reset              | web,guest  |
|        | GET|HEAD  | password/reset/{token?}      |                         | App\Http\Controllers\Auth\PasswordController@showResetForm      | web,guest  |
|        | POST      | register                     |                         | App\Http\Controllers\Auth\AuthController@register               | web,guest  |
|        | GET|HEAD  | register                     |                         | App\Http\Controllers\Auth\AuthController@showRegistrationForm   | web,guest  |
+--------+-----------+------------------------------+-------------------------+-----------------------------------------------------------------+------------+

就像我说的,所有上述路线都在工作,除了

/dashboard/users
/dashboard/posts

应该路由到 DashboardUsersController 和 DashboardPostsController 的 index 方法,以及我创建的每个自定义路由。

当我删除 Route::resource 时,Route::get('dashboard/users', 'DashboardUsersController@index'); 工作了,那么可能是一个错误吗?还是我忘记设置的东西?

编辑 2

当我尝试了

Route::get('dashboard/users', 'DashboardUsersController@getUsers');

我删除了

Route::resource('/dashboard/users', 'DashboardUsersController');

确保它没有冲突,并且仍然没有工作

【问题讨论】:

  • 使用php artisan route:list 检查您定义的路线
  • 如果你改变顺序会发生什么 "Route::resource('/dashboard', 'DashboardController');"在底部?
  • 我编辑了我的答案,我解释了当您使用 Route::resource 时会发生什么,以便我的答案是完整的。我希望这会有所帮助。
  • 是的,但我仍然不明白为什么只有 DashboardUsersControllerDashboardPostsControllerindex 方法不起作用,但 createedit 等正在工作
  • @CesarHenriqueDamascena 我在回答中解释了这一点。 Michal 基本上将我所说的内容纳入了他的回答中。他的其余回答毫无意义。如果您所做的只是接受错误的答案,那么尝试帮助您是多么浪费时间......正如所解释的......您制作了一个额外的 get 路由,该路由与由资源类型路由创建的 get 路由冲突。其他人不会仅仅因为您没有与他们做出任何冲突的路线而发生冲突。 Michal 基本上建议 - 你停止使用 resource 来支持“正常方法” - 无论这意味着什么,都是一种反解决方案......

标签: php laravel routes


【解决方案1】:

为简单起见,将Route::get 用于控制器中的普通方法,将Route::post 用于从表单接收$_POST 数据的方法。

Route::get/Route::post方法的第二个参数是ControllerName@MethodName。尝试相应地更改它。

尽量不要忘记命名空间。

编辑: 当使用Route::resource 时,您实际上是在为您的控制器生成所有可能的 RESTful 路由。你不能多次这样做。这就是为什么将 Route::resource 更改为 Route::get 确实有效的原因。

您可以在这里找到更多信息:https://laravel.com/docs/5.2/controllers#restful-resource-controllers

【讨论】:

  • 是的,当我删除所有 Route::resource 工作时,为什么当我创建超过 1 个时,路由停止正常工作,这是一个错误?跨度>
  • 说实话我也学到了一些新东西。 :) 从这里laravel.com/docs/5.2/controllers#restful-resource-controllers 我了解到,在使用 Route::resource 时,您实际上是在将所有可能的 RESTfull 路由添加到您的控制器。您不能多次这样做。
  • 这就是为什么这不完全是一个答案,无论是否有用。问题在于,正如我在回答中强调的那样,他正在制定一条相互矛盾的路线
  • @Jonathan,对不起,这是一个例子,当我尝试 Route::get('/dashboard/users', 'DashboardUsersController@getUsers') 时,我评论了 Route::resource('/dashboard/users','DashboardUsersController') 进行测试,但仍然没有工作
  • 将我在回答中所说的内容合并到您自己的答案中并不酷...如果您的问题通过删除任一路线得到解决,那么我的回答是正确的。您在使用资源时与路线发生冲突,我已经以不可能更清晰的方式为您解释了......
【解决方案2】:

你不是很清楚什么是有效的,什么是无效的。您还添加了更多用于说明目的的代码,我们必须填补关于您在做什么的假设中的空白。

当您定义资源时,例如Route::resource('/users', 'UserController');你会得到以下路由:

|        | GET|HEAD  | users                   | users.index   | App\Http\Controllers\UserController@index                       | web        |
|        | POST      | users                   | users.store   | App\Http\Controllers\UserController@store                       | web        |
|        | GET|HEAD  | users/create            | users.create  | App\Http\Controllers\UserController@create                      | web        |
|        | GET|HEAD  | users/{users}           | users.show    | App\Http\Controllers\UserController@show                        | web        |
|        | PUT|PATCH | users/{users}           | users.update  | App\Http\Controllers\UserController@update                      | web        |
|        | DELETE    | users/{users}           | users.destroy | App\Http\Controllers\UserController@destroy                     | web        |
|        | GET|HEAD  | users/{users}/edit      | users.edit    | App\Http\Controllers\UserController@edit                        | web        |

如果您随后创建另一个路由 Route::get('users', 'UserController@getUsers');,它将与您的 resource 路由定义的第一个路由冲突。

所以你需要确保你没有冲突的路线。

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多