有没有办法在 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];
}
}
以上代码解释:
为每个仪表板创建一个数组 (这将包含所有
仪表板内容) 作为 cards()
中的函数
NovaServiceProvider
需要一个数组 return。您可以通过调用您创建的 metrics(在 App\Nova\Metrics
中找到)来填充这些数组,只需键入以下内容即可调用它们:new MetricsName
.
用可匹配的键创建一个数组,在我的例子中我使用了 enums
所以我知道这个数据是并且可以匹配。
写一个 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;
}
}
以上代码解释:
- 为每个仪表板创建一个数组 (这将包含所有
仪表板内容) 作为
cards()
中的函数
NovaServiceProvider
需要一个数组 return。您通过调用您创建的 metrics(在 App\Nova\Metrics
中找到)来填充这些数组,您只需键入以下内容即可调用它们:new MetricsName
.
- 我通过提供的角色制作了一个切换案例,将再次根据
enums
检查,如果匹配 return 包含所有相应内容的仪表板数组。
我比较了两种解决方案,个人认为性能没有明显差异,所以任何一种解决方案都应该没问题。
我要找的是:
一种可能加载 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];
}
}
以上代码解释:
为每个仪表板创建一个数组 (这将包含所有 仪表板内容) 作为
cards()
中的函数NovaServiceProvider
需要一个数组 return。您可以通过调用您创建的 metrics(在App\Nova\Metrics
中找到)来填充这些数组,只需键入以下内容即可调用它们:new MetricsName
.用可匹配的键创建一个数组,在我的例子中我使用了
enums
所以我知道这个数据是并且可以匹配。写一个 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;
}
}
以上代码解释:
- 为每个仪表板创建一个数组 (这将包含所有
仪表板内容) 作为
cards()
中的函数NovaServiceProvider
需要一个数组 return。您通过调用您创建的 metrics(在App\Nova\Metrics
中找到)来填充这些数组,您只需键入以下内容即可调用它们:new MetricsName
. - 我通过提供的角色制作了一个切换案例,将再次根据
enums
检查,如果匹配 return 包含所有相应内容的仪表板数组。
我比较了两种解决方案,个人认为性能没有明显差异,所以任何一种解决方案都应该没问题。