Laravel路由,这是预期的行为吗?

时间:2018-12-03 21:30:24

标签: php laravel

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

我有一个名为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解释为头像。

1 个答案:

答案 0 :(得分:4)

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

GET user/{user}

为什么?因为路由资源创建了user/avatar/1路由,并且如果您首先注册了资源路由,那么Laravel将查看URL avatar并认为{{1}}部分实际上是用户ID。

这只是laravel的怪癖。