控制阵列,按头部角色链接,laravel-admin

发布于 2025-01-29 14:16:42 字数 2931 浏览 0 评论 0原文

我使用 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个分区。每个部分将拥有自己的管理员,他们将具有相应的角色。现在,所有扮演角色的管理员都可以看到标题中的所有链接,但是我需要隐藏它们,并确保管理员仅看到他在权利上发挥作用的链接。我该如何在标题中进行这样的检查?根据用户的角色显示这些链接。

我这样做了:

<?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'] : '')) {?>

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

I use https://laravel-admin.org/docs/en/README on my site.

I have a general header in the admin panel, which displays all the sections that can be edited, here is the code:

<?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 } ?>

So, I have 3 partitions. Each section will have its own admin, who will have a corresponding role. Now all admins with roles see all links in the header, but I need to hide them and make sure that the admin sees only the link to which he has a role with rights. How can I do such a check in the header? To display these links depending on the user's role.

I did it this way:

<?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 } ?>

It works, but I ended up with too much repetitive code. Is it possible to do it somehow simpler, to control all the roles in the array?

Something like this:

<?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 } ?>

Or:

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

But both options don't work for me..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眉目亦如画i 2025-02-05 14:16:42

您有多个可能的解决方案。一种是制作助手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 } ?>

You have multiple possible solution. One would be to make a helper adminHasAccess($link['uri']) and use it elegantly in your blade.

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;
    }
}

And in your blade:

<?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 } ?>

For the jammed solution, you can try

<?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 } ?>

Or more compact but less maintainable

<?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 } ?>
苏璃陌 2025-02-05 14:16:42

这是一个政体,政策应有助于解决您的问题,

我将为用户,发布,评论模型制定政策,而后来我将使用 can() and co. 帮助者可以使用身份验证用户查看模型的视图,就像在您的策略中,您正在检查Auth用户ROL。

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

This is a tipical situation where Policies should help to resolve your problem

I would create a Policies for User, Post, Comment Models and later in my view I would use can() and cannot() helpers to check view on models with the auth user, as in your policies you are checking the auth user Rol.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文