有没有办法在 Nova 中动态切换默认仪表板

Is there a way to dynamically switch default dashboards in Nova

我要找的是:

一种可能加载 app\Nova\Dashboards\DashboardExample 作为默认仪表板的方法。

问题

Nova 附带一个内置于 NovaServiceProvider 中的默认仪表板,您可以使用 dashboards() 函数添加其他仪表板。

使用此 dashboards() 函数时,您会初始化 其他 仪表板,而不是加载到与 默认 仪表板不同的仪表板中这不是我要找的。

默认仪表板是您登录后最终到达的标准位置,但并非每个用户都应该看到相同的仪表板,这就是为什么我正在寻找一种方法来根据您的 更改默认仪表板'roles'.

当前“解决方案”:

目前我正在调用 cards() 函数中的自定义函数。 cards() 函数需要一个 cards/metrics 的数组来填充默认仪表板。

cards() 中的 'custom' 函数需要您的当前角色

'custom' dashboardContent() 函数为每个包含其相应内容的仪表板提供了一个数组。

根据您作为用户的角色,您的仪表板将填充属于您相应角色的内容。

我通过制作一个包含所有 'dashboard arrays' 的数组并给它们一个 key/value 来做到这一点使用 角色枚举 配对。因此,如果您的角色匹配 enum 数组键 ,它将 return 包含 构建 默认仪表板所需内容的相应仪表板数组.

public function dashboardContent($role)
{
    //array of metrics per dashboard
    $role1Metrics = [new Metrics1, new Metrics2, new Metrics3];
    $role2Metrics = [new Metrics1, new Metrics2];
    $role3Metrics = [new Metrics3];

    $dashboard = array(
        Roles::role1()->getValue() => $role1Metrics,
        Roles::role2()->getValue() => $role2Metrics,
        Roles::role3()->getValue() => $role3Metrics
    );

    if (array_key_exists($role, $dashboard)) {
        return $dashboard[$role];
    }
}

这也可以使用 switch case 来完成,它看起来像这样:

public function dashboardContent($role)
{
    //array of metrics per dashboard
    $role1Metrics = [new Metrics1, new Metrics2, new Metrics3];
    $role2Metrics = [new Metrics1, new Metrics2];
    $role3Metrics = [new Metrics3];

    switch($role) {
        case Roles::role1():
            return $role1Metrics;
        case Roles::role2():
            return $role2Metrics;
        case Roles::role3():
            return $role3Metrics;
    }
}

这一切都很好,我没有发现任何不好的表现。但是,我对必须像这样特意使用默认仪表板感觉不太好。

最终,如果我可以在 app\Nova\Dashboards\ 中制作仪表板并根据 角色 将它们初始化为默认值,我会很高兴。我觉得这在未来会更易于维护,因为仪表板内容都将位于各自的文件中,而不必将它们添加到自定义函数中的数组中。

我在 GitHub 上的 issue 已被标记为 next-series,这意味着下一个版本会考虑这样做。这回答了我的问题,因此意味着截至目前,这目前 不可能

如果有新版本,我会保持更新。

但是到那时,如果您正在寻找解决方法:

NovaServiceProvider 中有一个名为 cards() 的函数,这是您的 default 仪表板需要内容的地方。

我们将创建一个名为 dashboardContent() 的函数。在我的例子中 dashboardContent() 将需要一个角色,但只要您不直接复制我的代码,这可以是任何角色(角色、身份验证、ID、用户)。

cards()函数调用中:

return $this->dashboardContent(CurrentRole::getRole());

创建函数:dashboardContent():

解决方案 1:密钥配对

public function dashboardContent($role)
{
    //i have 3 roles, so 3 different dashboards
    $role1Metrics = [new Metrics1, new Metrics2, new Metrics3];
    $role2Metrics = [new Metrics1, new Metrics2];
    $role3Metrics = [new Metrics3];

    //i have an enum key => value combination
    $dashboard = array(
        Roles::role1()->getValue() => $role1Metrics,
        Roles::role2()->getValue() => $role2Metrics,
        Roles::role3()->getValue() => $role3Metrics
    );

    //if my enum key matches the users current role, return corresponding dashboard
    if (array_key_exists($role, $dashboard)) {
        return $dashboard[$role];
    }
}

以上代码解释:

  1. 为每个仪表板创建一个数组 (这将包含所有 仪表板内容) 作为 cards() 中的函数 NovaServiceProvider 需要一个数组 return。您可以通过调用您创建的 metrics(在 App\Nova\Metrics 中找到)来填充这些数组,只需键入以下内容即可调用它们:new MetricsName.

  2. 用可匹配的键创建一个数组,在我的例子中我使用了 enums 所以我知道这个数据是并且可以匹配。

  3. 写一个 if 语句来检查用户角色是否匹配数组键,在我的例子中它应该总是像我使用的那样做 enums.

解决方案 2:switch case

public function dashboardContent($role)
{
    //array of metrics per dashboard
    $role1Metrics = [new Metrics1, new Metrics2, new Metrics3];
    $role2Metrics = [new Metrics1, new Metrics2];
    $role3Metrics = [new Metrics3];

    switch($role) {
        case Roles::role1():
            return $role1Metrics;
        case Roles::role2():
            return $role2Metrics;
        case Roles::role3():
            return $role3Metrics;
    }
}

以上代码解释:

  1. 为每个仪表板创建一个数组 (这将包含所有 仪表板内容) 作为 cards() 中的函数 NovaServiceProvider 需要一个数组 return。您通过调用您创建的 metrics(在 App\Nova\Metrics 中找到)来填充这些数组,您只需键入以下内容即可调用它们:new MetricsName.
  2. 我通过提供的角色制作了一个切换案例,将再次根据 enums 检查,如果匹配 return 包含所有相应内容的仪表板数组。

我比较了两种解决方案,个人认为性能没有明显差异,所以任何一种解决方案都应该没问题。