【问题标题】:set Default value for a route in laravel alongside a url param binding在 url 参数绑定旁边设置 laravel 中路由的默认值
【发布时间】: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


【解决方案1】:

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

希望它现在可以工作。

【讨论】:

    【解决方案2】:

    要在路由explicit binding中获取默认值,您需要在路由上设置默认值

        Route::name('page')
        ->get('/{permalink?}', [Controller::class, 'index'])
        ->setDefaults(['permalink' => 'startpage']);
    

    URL::defaults 用于生成 URL

    【讨论】:

      【解决方案3】:

      可以通过这个来实现基于登录用户的动态默认值。

      https://laravel.com/docs/8.x/urls#default-values

      语言环境示例正是您正在寻找的。​​p>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-17
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多