簡體   English   中英

Laravel路由,這是預期的行為嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM