自定义@can()以显示页面/部分

时间:2017-03-22 14:56:40

标签: laravel-5 laravel-5.4 laravel-blade

在工作中,我维护了一个相当复杂的Laravel应用程序,随着新功能的实施和改进,该应用程序仍在不断发展。

我们在此系统中有非技术管理员来管理其他用户权限,有时很难知道哪些权限最终会阻止用户访问某个页面,或者什么可能会给用户带来太多访问权限。更好的权限描述以及模拟用户查看他们可以访问的内容的能力已经是我们所做的。

除此之外,我们还希望切换刀片模板中定义的权限的叠加层,我们可以使用

定义此权限
@can('update', $post)
    <!-- Menu button to update a $post -->
@endcan

@can('manage_user_roles_and_permissions')
    <!-- A table with many different functions 
         for managing user roles + permissions -->
@endcan

有没有办法可以修改@can()在刀片模板中的工作方式,这样我就可以添加一些javascript来显示部分开始和结束的位置,例如&#34;权限&# 39; Show Post&#39;这个菜单按钮需要显示&#34;或者&#34;要查看以下部分,用户需要“管理”用户角色和权限&#39;权限&#34 ;.或者甚至更好,如果我可以添加一个红色边框的div。

如何在刀片模板中使用@can()附加其他javascript / html来显示叠加层。

1 个答案:

答案 0 :(得分:0)

要解决此问题,我需要扩展刀片,请参阅Laravel文档中的Extending Blade

以下是我做的快速测试,看看是否可行。在这种情况下,$value是一个字符串,其中包含处理之前刀片文件的内容。因此,我可以使用preg_match_all()查找@can语句,然后在需要的地方附加我的javascript。我可以以相同的方式找到@endcan,但很难知道哪个@endcan属于哪个@can但是从这一点开始匹配应该相当容易。

<?php

namespace App\Providers;

use Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Blade::extend(function($value)
        {
            $can_array = array();
            preg_match_all('/(\s*)@(can)\(([^\)]*)\)(\s*)/', $value, $matches);
            if (count($matches) > 0 && isset($matches[3])) {
                foreach ($matches[3] as $match) {
                    if (!in_array($match, $can_array)) {
                        $can_array[] = $match;
                    }
                }
            }
            foreach ($can_array as $ca) {
                $value = str_replace("@can(" . $ca . ")", "@can(" . $ca . ") \r\n <!-- My javascript code goes here! -->", $value);
            }
            // TODO need to figure out a better way to handle this
            $value = str_replace("@endcan", "@endcan \r\n <!-- Section ended here -->", $value);
            return $value;
        });
    }
...

我的源代码现在看起来像是这样,实现了目标!

enter image description here