实际上,这不是问题,我想我可以解决,但是我想知道这是否符合预期。
我有一个名为users
的数据库表,然后我创建了Model和UserController作为资源,
php artisan make:controller UserController --resource
它创建了预期的路线(索引,存储,创建,显示,更新,销毁和编辑),有些需要一些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的 / user / {id} 路由,并将“头像”视为{id}。
所以我知道,我应该取出Route::resource('user', 'UserController');
行并分别创建每条路线,对吗?
我的问题是,这应该如何工作?我应该创建其他HelperController来指向/ avatar / {id?}路由吗?
编辑: 与用户有关的artisan route:list输出为:
| | 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
是未定义的,我知道是什么原因造成的,这是因为show find($id)
里面的show(在Controller中)什么也没得到,因为它正在搜索“头像”作为ID。
实际上,如果我将find()
的{{1}}更改为预期的404错误。因此,我很确定它将ID解释为头像。
答案 0 :(得分:4)
您必须先定义最明确的路线:
GET user/{user}
为什么?因为路由资源创建了user/avatar/1
路由,并且如果您首先注册了资源路由,那么Laravel将查看URL avatar
并认为{{1}}部分实际上是用户ID。
这只是laravel的怪癖。