首页 > 解决方案 > 在 url 参数绑定旁边设置 laravel 中路由的默认值

问题描述

好的,可以说我有一个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();
        });
    }
}

目前一切正常,但只有当我username在 url 中提供参数时,例如,如果我去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);
    }
}

但这也不起作用,只是$useredit方法中向我显示一个 null 。这是为什么?

标签: laraveleloquentlaravel-routinglaravel-6

解决方案


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

希望它现在可以工作。


推荐阅读