设置laravel中与url参数绑定绑定的路由的默认值

问题描述 投票:0回答:1

好吧,我有一个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的空值。为什么呢?

laravel eloquent laravel-routing laravel-6
1个回答
0
投票

请确保您已经为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
}

希望它现在可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.