[英]Laravel routing, is this the expected behavior?
我想我可以解決,但實際上不是問題,但是我想知道這是否符合預期。
我有一個名為users
的數據庫表,然后我將Model和UserController創建為資源
php artisan make:controller UserController --resource
它創建了預期的路線(索引,存儲,創建,顯示,更新,銷毀和編輯),其中一些會獲得一些POST。
因此,現在我想創建一條新路徑,為我提供用戶的頭像(我之前使用Storage方法存儲的圖像)
因此,我在/routes/web.php文件中將其創建為:
Route::get('/user/avatar/{id?}', 'UserController@avatar')->name('user.avatar');
我知道該函數有效,如果我轉到http:// localhost / user / avatar / 1,它將返回與用戶1相關的圖像。現在,如果我不希望該參數為可選(可空), t獲取ID,然后我將提供\\Auth::user()->id
圖像。
問題出在我去http:// localhost / user / avatar /時,它給了我一個錯誤(我不會在這里打印它,因為它不相關),它似乎正在嘗試轉到GET的使用資源創建的/ user / {id}路由,並將“頭像”視為{id}。
所以我知道,我應該取出Route::resource('user', 'UserController');
並分別創建每個路線,對嗎?
我的問題是,這應該如何工作? 我是否應該在可以指向/ avatar / {id?}路由的位置創建其他HelperController?
編輯:工匠路線:關於用戶的列表輸出是:
| | 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(在Controller中)里面的find($id)
什么都沒有得到的,因為它正在搜索“頭像” ”作為ID。
實際上,如果我將find()
更改為findOrFail()
它會給我預期的404錯誤。 因此,我很確定它將ID解釋為頭像。
您必須首先定義最明確的路由:
Route::get('/user/avatar/{id?}', 'UserController@avatar');
Route::resource('user', 'UserController');
為什么? 因為路由資源會創建GET user/{user}
路由,並且如果您先注冊資源路由,則Laravel將查看url user/avatar/1
並認為avatar
部分實際上是user的ID。
這只是laravel的怪癖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.