【发布时间】:2020-02-07 16:09:52
【问题描述】:
好吧,假设我有一个ProfileController.php。
在edit 方法中看起来像这样:
class ProfileController extends Controller
{
public function edit(\App\User $user)
{
return view('profile.edit',compact('user'));
}
public function update(\App\User $user, \App\Http\Requests\ProfileRequest $request)
{
$user->update($request->all());
return back()->withStatus(__('Profile successfully updated.'));
}
}
它只是显示用户的个人资料和编辑它的表单。
此方法的路径如下所示:
Route::group(['middleware' => 'auth'], function () {
Route::group(['middleware' => '\App\Http\Middleware\DefaultUrlParamsMiddleware'], function () {
Route::get('profile/{username?}', ['as' => 'profile.edit', 'uses' => 'ProfileController@edit']);
Route::put('profile/{username?}', ['as' => 'profile.update', 'uses' => 'ProfileController@update']);
});
});
如您所见,此 url 中有一个可选的 username 参数,我想要将此 url 参数绑定到 ProfileController.php 方法所需的用户对象。
为此,我的 appProvider.php 中有这个:
class AppServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot(Router $router)
{
// provide user for profile edit
$router->bind( 'username', function ( $username ){
return \App\User::where( 'name', $username )->firstOrFail();
});
}
}
目前一切正常,但只有当我在 url 中提供 username 参数时,例如,如果我转到 mydomain.test/profile/mytestinguser 它工作正常。
如果我没有在 URL 中提供用户名参数,我想要什么,它应该默认使用我当前的用户名,
所以如果我去mydomain.test/profile它应该考虑用户名参数等于我当前的用户名mytestinguser,然后使用绑定将其解析为用户对象,然后将其传递给edit方法。但它不起作用。于是我稍微查了一下,中间件里面有关于 URL::defaults 的东西,所以我设置了这个中间件叫DefaultUrlParamsMiddleware 然后它的内容如下:
use Illuminate\Support\Facades\URL;
class DefaultUrlParamsMiddleware
{
public function handle($request, Closure $next)
{
URL::defaults(['username' => auth()->user()->name ]);
return $next($request);
}
}
但这也不起作用,只是在 edit 方法中向我显示一个 null 为 $user。这是为什么呢?
【问题讨论】:
-
请确认您是否已将中间件添加到
protected $routeMiddleware数组中的app/Http/Kernel.php? -
另外,请确保您在
use语句上方的中间件顶部使用了正确的namespace。
标签: laravel eloquent laravel-routing laravel-6