2017-03-22 2 views
0

Bei der Arbeit ich eine ziemlich komplexe Laravel-Anwendung pflegen, die immer noch wächst, wie neue Funktionen implementiert und verbessert werden.Anpassen @can(), um eine Berechtigungsüberlagerung für Seiten/Abschnitte anzuzeigen

Wir haben nicht-technische Administratoren in diesem System, die andere Benutzer Berechtigungen verwalten und manchmal kann es schwer zu wissen, welche Berechtigung blockiert den Zugriff eines Benutzers auf eine bestimmte Seite oder was könnte einen Benutzer zu viel Zugriff geben. Bessere Beschreibungen für Berechtigungen und die Möglichkeit, einen Benutzer zu simulieren, um zu sehen, auf was er Zugriff hat, haben wir bereits gemacht.

Zusätzlich dazu würden wir Overlays wie in Blattvorlagen definiert für Berechtigungen wechseln, können wir diese Berechtigungen mit

@can('update', $post) 
    <!-- Menu button to update a $post --> 
@endcan 

oder

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

Gibt es eine Möglichkeit definiert ich das ändern kann So funktioniert die @can() in Blade-Vorlagen, so dass ich etwas Javascript hinzufügen kann, um ein Popover für wo ein Abschnitt beginnt und endet anzuzeigen, wie "Die Berechtigung 'Show Post' ist für diese Menüschaltfläche erforderlich" oder "anzuzeigen, um den folgenden Abschnitt zu sehen Ein Benutzer braucht t Er "Verwalten von Benutzerrollen und Berechtigungen". Oder noch besser, wenn ich ein div mit einem roten Rand um den Abschnitt hinzufügen könnte.

Wie kann ich zusätzliche Javascript/HTML hinzufügen, wo @can() in einer Blade-Vorlage verwendet wird, um ein Overlay anzuzeigen.

Antwort

0

Um dieses Problem zu beheben, muss ich Blade erweitern, siehe Extending Blade in der Laravel-Dokumentation.

Das folgende ist ein schneller Test, den ich gerade gemacht habe, um zu sehen, ob das möglich war. $value In diesem Fall ist eine Zeichenfolge, die den Inhalt einer Blade-Datei vor der Verarbeitung enthält. So kann ich preg_match_all() verwenden, um die @can Aussagen zu finden und dann mein Javascript anfügen, wo erforderlich. Ich kann die @endcan in der gleichen Weise finden, aber es ist schwieriger zu wissen, welche @endcan zu welcher @can gehört, aber es sollte ziemlich einfach sein, von diesem Punkt an anzupassen.

<?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; 
     }); 
    } 
... 

Mein Quellcode sieht jetzt so aus, wenn er angezeigt wird, Ziel erreicht!

enter image description here

Verwandte Themen