如何在命名路由具有通配符的视图中使用命名路由

how to use named routes in view where named routes have wildcard

我有这样一组路线

Route::group(['prefix' => 'admin/{username}'],function()
{
    Route::get('', ['as' => 'dashboard', 'uses' => 'AdminController@index']);

    Route::get('settings', ['as' => 'settings', 'uses' => 'AdminController@settings']);
});

在我看来,我使用命名路由作为 link 参考,就像这样

<li><a href="{{ route( 'settings' ) }}"><span>Settings</span></a></li>

但它呈现为

<li><a href="http://localhost:8000/admin/%7Busername%7D/settings"><span>Settings</span></a></li>

用户名按字面意思打印,而不是实际值。我真正想要的是这个

<li><a href="http://localhost:8000/admin/john/settings"><span>Settings</span></a></li>

如何操作?

生成URL时必须传递路由参数。喜欢:

{{ route('settings', ['john']) }}

显然你更愿意做这样的事情:

{{ route('settings', [$user->name]) }}

因为您只有一个参数,所以您甚至不必将其作为数组传递:

{{ route('settings', $user->name) }}

您应该尝试以下...

<li><a href="{{ route( 'settings', Auth::user()->username ) }}"><span>Settings</span></a></li>

您必须将当前用户名作为第二个参数传递。

因此地址看起来更好,如果您的用户名是大写字母,您可以使用 strtolower()

<li><a href="{{ route( 'settings', strtolower(Auth::user()->username) ) }}"><span>Settings</span></a></li>

注意

Auth::user() 适用于当前用户。如果没有人登录,你会得到一个错误! 所以你可以检查一下。

@if(Auth::user())
    <li><a href="{{ route( 'settings', strtolower(Auth::user()->username) ) }}"><span>Settings</span></a></li>
@endif

另一种方法是传递通配符以通过控制器查看并在路由中将其用作第二个参数

首先在控制器中传递通配符

public function index($username)
{
    return view('admin.dashboard', compact('username'));
}

并在视图中将变量作为第二个参数传递给路由

<li><a href="{{ route( 'settings', $username) }}"><span>Settings</span></a></li>