首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制数组,按角色链接在标题中,laravel-admin

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

Stack Overflow用户
提问于 2022-05-17 11:24:36
回答 2查看 318关注 0票数 5

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

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

代码语言:javascript
复制
<?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 } ?>

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

我是这样做的:

代码语言:javascript
复制
<?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 } ?>

它可以工作,但是我最终得到了太多重复的代码。是否可以在某种程度上更简单地控制数组中的所有角色?

就像这样:

代码语言:javascript
复制
<?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 } ?>

或者:

代码语言:javascript
复制
<?php if (in_array($link['uri'], 
Admin::user()->isRole('administrator') ? ['users', 'posts', 'comments'] : 
Admin::user()->isRole('post-admin') ? ['posts'] : '')) {?>

但这两种选择对我都不管用..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-02 14:50:52

你有多种可能的解决方案。其中之一是制作一个助手adminHasAccess($link['uri']),并在您的刀片中优雅地使用它。

代码语言:javascript
复制
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;
    }
}

在你的刀刃上:

代码语言:javascript
复制
<?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 } ?>

对于堵塞的解决方案,您可以尝试

代码语言:javascript
复制
<?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 } ?>

或者更紧凑,但更不容易维护

代码语言:javascript
复制
<?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 } ?>
票数 3
EN

Stack Overflow用户

发布于 2022-06-04 12:04:35

在这种情况下,政策应该有助于解决你的问题。

我将为用户、Post、注释模型创建策略,在我的观点中,稍后我将使用can()can()助手与auth用户一起检查模型的视图,就像在您的策略中检查auth用户Rol一样。

https://laravel.com/docs/9.x/authorization#writing-policies

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72273188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档