控件数组,在标题中按角色链接,laravel-admin



我在我的网站上使用https://laravel-admin.org/docs/en/README。

我在管理面板中有一个通用的标题,它显示了所有可以编辑的部分,下面是代码:

<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (in_array($link['uri'], ['users', 'posts', 'comments'])) {?> 
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>

我有3个分区。每个部分都有自己的管理员,管理员将具有相应的角色。现在,所有具有角色的管理员都可以看到标题中的所有链接,但我需要隐藏它们,并确保管理员只看到他具有角色权限的链接。我如何在header中进行这样的检查?根据用户的角色显示这些链接。

我是这样做的:

<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (Admin::user()->isRole('administrator')) {?>
<?php if (in_array($link['uri'], ['users', 'posts', 'comments'])) {?> 
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>
<?php if (Admin::user()->isRole('post-admin')) {?>
<?php if (in_array($link['uri'], ['posts'])) {?> 
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>
<?php if (Admin::user()->isRole('comment-admin')) {?>
<?php if (in_array($link['uri'], ['comments'])) {?> 
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>
<?php } ?>

它工作,但我结束了太多的重复代码。有没有可能用更简单的方式来控制数组中的所有角色?

像这样:

<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (in_array($link['uri'], 
if (Admin::user()->isRole('administrator')) {
['users', 'posts', 'comments']
}
else if (Admin::user()->isRole('post-admin')) {
['posts']
}
)) {?> 
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>

或:

<?php if (in_array($link['uri'], 
Admin::user()->isRole('administrator') ? ['users', 'posts', 'comments'] : 
Admin::user()->isRole('post-admin') ? ['posts'] : '')) {?>

但是两个选项都不适合我。

你有多种可能的解决方案。一种方法是创建一个辅助器adminHasAccess($link['uri']),并在您的刀片中优雅地使用它。

function adminHasAccess($uri)
{
switch($uri) {
case 'users':
return Admin::user()->isRole('administrator');
case 'posts':
return Admin::user()->isOne(['post-admin', 'administrator']);
case 'comments':
return Admin::user()->isOne(['comment-admin', 'administrator']);
default:
return false;
}
}

在你的刀刃上:

<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (adminHasAccess($link['uri'])) {?> 
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>

对于卡住的解决方案,您可以尝试

<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (
(Admin::user()->isRole('administrator') &&  in_array($link['uri'], ['users', 'posts', 'comments'])) ||
(Admin::user()->isRole('post-admin') && in_array($link['uri'], ['posts'])) ||
(Admin::user()->isRole('comment-admin') && in_array($link['uri'], ['comments']))
) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>

或者更紧凑但更难以维护

<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (in_array($link['uri'], Admin::user()->isRole('administrator') ? ['users', 'posts', 'comments'] : (Admin::user()->isRole('post-admin') ? ['posts'] : (Admin::user()->isRole('comment-admin') ? ['comments'] : [])))) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>

这是策略应该帮助解决问题的典型情况

我将为用户,帖子,评论模型创建一个策略,然后在我的视图中,我将使用can()不能()在您的策略中,您正在检查auth用户Rol。

https://laravel.com/docs/9.x/authorization撰写政策

相关内容

  • 没有找到相关文章

最新更新