2013-06-13 5 views
8

La mia applicazione mostra un elenco di progetti, pagine di dettagli del progetto e moduli per modificare questi progetti. Questi sono i percorsi:Symfony2: Come nascondere il collegamento in Twig in base alle autorizzazioni

  • /- elenco dei progetti
  • /progetto/42 - Progetto visualizzazione (pagina di dettaglio del progetto)
  • /progetto/42/modifica - modifica del progetto

Solo il suo proprietario può modificare un progetto.

Ho implementato un Voter per impedire l'accesso a/project/42/edit per i non proprietari.

Ora, voglio anche nascondere il collegamento "modifica progetto" dalla pagina dei dettagli del progetto. Quale sarebbe il modo di fare questo? Idealmente, in Ramoscello, mi piacerebbe fare qualcosa di simile

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

posso implementare questa funzione come estensione di Twig, ma forse una funzionalità simile già esiste.

risposta

10

La funzione is_granted() in realtà has a second parameter che mi permette di fare proprio quello che mi serve:

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

Io uso questo in combinazione con un segno di spunta nella azione di controllo:

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

Questo è in realtà molto simile all'approccio utilizzato da nifr nella sua risposta allo Sonata User - Security on custom field. Speravo di trovare un modo per far chiamare automaticamente l'elettore ed evitare la chiamata a isGranted().

Se si vuole dare un'occhiata al codice completo, è nel progetto tutorial che ho published in github.

+2

Si prega di notare, chiunque può url hack. Assicurati che anche il tuo controller abbia i reindirizzamenti appropriati. – Lighthart

+0

Bel lavoro. Una cosa da notare, se '$ this-> show ($ project);' sta solo restituendo la stessa vista della pagina del progetto (/ project/42). Probabilmente sarebbe meglio usare un reindirizzamento 302 su quella rotta. – Paulpro

+0

Ah, mi dispiace, il mio $ this-> show ($ project) è in realtà solo un piccolo helper che restituisce $ this-> redirect ($ this-> generateUrl ('project_show', array ('id' => $ project- > getId()))); – Olav