【发布时间】: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 谢谢,已发布。