2017-03-22 58 views
0

在工作權限覆蓋我保持新功能實現和改進其仍在增長一個相當複雜的Laravel應用。自定義@can(),以顯示頁/段

我們在這個系統中的非技術管理員誰管理其他用戶的權限,有時可能很難知道什麼許可結束訪問某個頁面或者什麼可以給用戶太大的出入封鎖的用戶。更好地描述權限和模擬用戶以查看他們有權訪問的功能已經成爲我們所做的事情。

除了這一點,我們想切換覆蓋在刀片模板中定義的權限,我們可以定義與

@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來顯示,其中「是必須的權限‘顯示郵報’這個菜單按鈕,顯示」一節開始和結束,像或「看到下面一節酥料餅用戶需要t他'管理用戶角色和權限'權限「。或者甚至更好,如果我可以在該部分周圍添加帶有紅色邊框的div。

我如何可以附加額外的JavaScript/HTML,其中@can()在刀片模板用於顯示的覆蓋。

回答

0

爲了解決這個問題,我需要延長刀片,看到Extending Blade的Laravel文檔。

下面是一個簡單的測試,我做只是爲了看看這是可能的。在這種情況下,$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

相關問題