【问题标题】:Laravel routing, is this the expected behavior?Laravel 路由,这是预期的行为吗?
【发布时间】:2019-05-05 05:53:43
【问题描述】:

实际上不是问题,我想我可以处理,但我想知道这是否符合预期。

我有一个名为 users 的数据库表,然后我创建了 Model 和 UserController 作为资源

php artisan make:controller UserController --resource

它创建了预期的路由(索引、存储、创建、显示、更新、销毁和编辑),一些 GET 一些 POST。

所以现在我想创建一条新路线,为我提供用户头像(我之前使用存储方法存储的图像)

所以我在 /routes/web.php 文件中将其创建为:

Route::get('/user/avatar/{id?}', 'UserController@avatar')->name('user.avatar');

我知道该函数有效,如果我转到http://localhost/user/avatar/1,它会返回与用户 1 关联的图像。现在问题是,我希望参数是可选的(可为空),如果我没有得到 id 则我将提供\Auth::user()->id 图像。

问题是当我转到http://localhost/user/avatar/ 时它给了我一个错误(我不会在这里打印它,因为它不相关),看起来它正在尝试转到 GET 的 /使用资源创建的用户/{id} 路由,并将“头像”视为 {id}。

所以我知道,我应该取出Route::resource('user', 'UserController'); 并单独创建每条路线,对吗?

我的问题是,它应该是这样工作的吗?我应该创建其他的,比如 HelperController 来指向 /avatar/{id?} 路由吗?

编辑: 工匠路线:关于用户的列表输出是:

|        | GET|HEAD  | user                   | user.index       | App\Http\Controllers\UserController@index                              | web          |
|        | POST      | user                   | user.store       | App\Http\Controllers\UserController@store                              | web          |
|        | GET|HEAD  | user/avatar/{id?}      | user.avatar      | App\Http\Controllers\UserController@avatar                             | web          |
|        | GET|HEAD  | user/create            | user.create      | App\Http\Controllers\UserController@create                             | web          |
|        | GET|HEAD  | user/{user}            | user.show        | App\Http\Controllers\UserController@show                               | web          |
|        | PUT|PATCH | user/{user}            | user.update      | App\Http\Controllers\UserController@update                             | web          |
|        | DELETE    | user/{user}            | user.destroy     | App\Http\Controllers\UserController@destroy                            | web          |
|        | GET|HEAD  | user/{user}/edit       | user.edit        | App\Http\Controllers\UserController@edit                               | web          |
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+

错误是:

 ErrorException (E_ERROR)
Trying to get property 'name' of non-object (View: D:\Dropbox\_www\reco\resources\views\user\profile.blade.php)
Previous exceptions

    Trying to get property 'name' of non-object (0)

这是在 $user->name 调用中,$user 未定义,我知道是什么原因造成的,它是 find($id) 内部显示(在控制器中)什么都没有,因为它正在搜索“头像"作为身份证件。

事实上,如果我将find() 更改为findOrFail(),它会给我预期的404 错误。所以我很确定它将头像解释为id。

【问题讨论】:

  • 请告诉我们/user/avatar/ 的错误是什么。您也可以考虑分享您的 php artisan route:list 输出。
  • 在定义 Route::resource 之前定义 Route::get('/user/avatar/{id?}')。您遇到的错误可能是因为路由器认为 /avatar/ 部分是 id 参数。但是,是的,一些关于错误的信息会很棒。
  • 这是正确答案!在资源之前移动获取路线,使一切正常!谢谢!
  • 请将其写为 aswer 以便我检查 ;-)
  • @luisfer 谢谢,已发布。

标签: php laravel


【解决方案1】:

您必须首先定义最明确的路线:

Route::get('/user/avatar/{id?}', 'UserController@avatar');
Route::resource('user', 'UserController');

为什么?因为 route 资源创建了一个 GET user/{user} 路由,如果你先注册资源路由,Laravel 会查看 url user/avatar/1 并认为 avatar 部分实际上是用户的 ID。

这只是 laravel 的一个怪癖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多