好吧,我有一个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);
}
}
但是那也不起作用,只是在$user
方法中显示为edit
的空值。为什么呢?
请确保您已经为app/Http/Kernal.php
文件中的路由注册/添加了中间件。例如
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
....
protected $routeMiddleware = [
...
'DefaultUrlParams' => \App\Http\Middleware\DefaultUrlParamsMiddleware::class,
]
}
然后在路由文件中使用它,如:
Route::group(['middleware' => ['DefaultUrlParams']], function () {
//routes goes here
}
希望它现在可以工作。