【问题标题】:Laravel default param on route路由上的 Laravel 默认参数
【发布时间】:2019-02-06 20:02:34
【问题描述】:

我正在尝试这样构建我的网络:

myapp.com/{myworkspace}/*

其中{myworkspace}是动态参数,*是web的所有ulr。

我只有在用户登录后才获得 myworkspace 参数,因为它是我的用户表的一个字段。我不想每次调用路由助手时都传递它,对于控制器操作也是不必要的。

所以,我在设置这个参数时遇到了问题,我也尝试了很多方法,比如 middelwares、会话、服务提供者和URL::defaults 方法。我想我错过了一些重要的东西,我无法通过其他任何方式实现它。

有人可以帮帮我吗?

更新

我正在尝试这样的路线:

Route::middleware(['auth'])->group(function () {
    ...
    Route::prefix('{workspace}')->group(function () {
        ...
        Route::get('/example', 'SomeController@show')->name('example.show')
    });
});

当我尝试使用{{route(example.show)}} 时,抛出异常Missing required parameters for [Route: example.show]。

【问题讨论】:

  • 请详细说明代码示例,以及您要实现的目标,
  • unnecesary for the controllers actions 那么你在哪里使用参数呢?
  • 仅供用户参考,为用户提供逻辑结构。

标签: php laravel laravel-routing laravel-5.6


【解决方案1】:

在您的设置中,example.show 是一个以 {workspace} 为前缀的路由。

{workspace} 是一个动态定义的路由参数,所以 Laravel 无法确定它是什么——你需要在尝试生成路由时定义它。

因此,例如,如果我的工作空间“丰富”,{{route(example.show)}} 将变为:

{{ route(example.show, ['workspace' => 'rich']) }}

Laravel 在named routes 上的文档有一个简短的例子。

编辑

如果您选择使用 `route()' 函数在刀片文件中生成 url,并且您有一个需要定期定义的通用路由参数,我会考虑编写一个帮助程序功能使这更容易。所以而不是:

{{ route(example.show, ['workspace' => 'rich']) }}

这可能变成:

{{ MyHelperClass::generateWorkspaceRoute('example.show') }} 

然后在你的帮助类文件中:

public function generateWorkspaceRoute($routeName) 
{
    $workspace = $this->getWorkspace();

    return route($routeName, ['workspace' => $workspace]);
}

private function getWorkspace() 
{
    // Your logic to determine workspace here.
    // If it is possible that we are generating this without an
    // authenticated user, then provide a fallback...
    return \Auth::check() ? \Auth::user()->workspace : 'workspace';
}

然后你可以在你的控制器中寻找你的后备,并重定向 经过身份验证的用户到他们正确的工作区:

// in SomeController
public function show($workspace)
{
    if($workspace === 'workspace') {
        // Because our controller is behind the 'auth' middleware, 
        // we should now be able to generate a correct workspace route
        return redirect(MyHelperClass::generateWorkspaceRoute('example.show'));
    }

    // Normal controller logic continues from here...
}

注意:这需要了解在为每个用户生成此文件时您的“后备”工作区将是什么 - 如果您允许您的用户定义它,那么您将需要阻止他们从选择您的后备选项。

【讨论】:

  • 你说得对,但我已经知道路由参数是如何工作的。我需要存档的是加载{workspace} 参数,而无需在每条路由中传递它,因为它是所有网络路由的前缀
  • 听起来您正在寻找路由前缀? laravel.com/docs/5.6/routing#route-group-prefixes
  • 我已经编辑了我的答案,包括一些关于更容易提供工作区参数的想法
  • 谢谢!感谢您的帮助,但我已经尝试过了。在这种情况下,我的问题是我无法在帮助程序类中使用/Auth::user(),如果可以,我会使用路由前缀,例如:Route::prefix( MyHelperClass::generateWorkspace() )
  • 嗯,好吧,听起来您正在寻找一些帮助来自动检索工作区参数?为此,我认为我们需要更多地了解它的来源?
猜你喜欢
  • 2020-05-17
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2014-01-11
  • 2017-01-13
  • 2014-09-18
相关资源
最近更新 更多