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

bro*_*art 7 php laravel 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 } ?>
Run Code Online (Sandbox Code Playgroud)

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

我是这样做的:

<?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 } ?>
Run Code Online (Sandbox Code Playgroud)

它有效,但我最终得到了太多重复的代码。是否可以以某种更简单的方式做到这一点,以控制阵列中的所有角色?

像这样的东西:

<?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 } ?>
Run Code Online (Sandbox Code Playgroud)

或者:

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

但这两种选择都不适合我..

N69*_*69S 3

你有多种可能的解决方案。一种方法是制作一个助手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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的刀片中:

<?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 } ?>
Run Code Online (Sandbox Code Playgroud)

对于卡住的解决办法,可以尝试

<?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 } ?>
Run Code Online (Sandbox Code Playgroud)

或者更紧凑但更不易维护

<?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 } ?>
Run Code Online (Sandbox Code Playgroud)