2013-06-13 5 views
8

Meine Anwendung zeigt eine Liste von Projekten, Projektdetailseiten und Formularen zum Bearbeiten dieser Projekte an. Dies sind die Routen:Symfony2: Verstecken von Links in Twig basierend auf Berechtigungen

  • /- Liste der Projekte
  • /Projekt/42 - Ansicht Projekt (Projektdetailseite)
  • /Projekt/42/bearbeiten - bearbeiten Projekt

Nur Der Besitzer kann ein Projekt bearbeiten.

Ich habe einen Voter implementiert, um den Zugriff auf/project/42/edit für Nicht-Besitzer zu verhindern.

Jetzt möchte ich auch den Link "Projekt bearbeiten" von der Projektdetailseite ausblenden. Was wäre der Weg dies zu tun? Idealerweise in Zweig, würde ich so etwas wie

 
{% if may_access(path('project_edit', { 'id': project.id })) %} 
    <a href="{{ path('project_edit', { 'id': project.id }) }}">edit project</a> 
{% endif %} 

tun, wie ich diese Funktion als Zweig Erweiterung implementieren kann, aber vielleicht eine ähnliche Funktionalität bereits vorhanden ist.

Antwort

10

Die Funktion is_granted() tatsächlich has a second parameter, die mir nur erlaubt, zu tun, was ich brauche:

 
{% if is_granted("MAY_EDIT", project) %} 
    <a href="{{ path('project_edit', { 'id': project.id }) }}">edit project</a> 
{% endif %} 

ich dies mit einem Scheck in der Controller-Aktion in Kombination verwenden:

 
public function editAction(Project $project) 
{ 
    if (!$this->get('security.context')->isGranted('MAY_EDIT', $project)) { 
     $this->flash('You are not allowed to edit this project'); 
     return $this->show($project); 
    } 
    // ... 
} 

Dies ist tatsächlich sehr ähnlich zu dem Ansatz, nifr in seiner Antwort auf Sonata User - Security on custom field verwendet. Ich hatte gehofft, einen Weg zu finden, den Wähler automatisch anzurufen und den Aufruf von isGranted() zu vermeiden.

Wenn Sie sich den vollständigen Code ansehen möchten, ist es in dem Tutorial-Projekt Ich habe published in github.

+2

Bitte beachten Sie, jeder kann URL Hack. Stellen Sie sicher, dass Ihr Controller über die entsprechenden Weiterleitungen verfügt. – Lighthart

+0

Gute Arbeit. Eine Sache zu beachten, wenn '$ this-> show ($ project);' nur die gleiche Ansicht wie die Projektseite (/ project/42) zurückgibt. Es wäre wahrscheinlich am besten, eine 302-Umleitung zu dieser Route zu verwenden. – Paulpro

+0

Ah, sorry, mein $ this-> show ($ project) ist eigentlich nur ein kleiner Helfer, der $ this-> redirect zurückgibt ($ this-> generateUrl ('project_show', array ('id' => $ project) > getId()))); – Olav

Verwandte Themen