2013-06-13 15 views
8

Uygulamam projelerin listesini, proje ayrıntı sayfalarını ve bu projeleri düzenlemek için formları gösterir. Bu rotalar şunlardır: - Projelerin listesi Symfony2: İzinlere bağlı olarak Twig'deki bağlantıyı gizleme

  • /proje/42 - görünümü projesi (proje detay sayfası)
  • /proje/42/düzenle -

    • /düzenle projesi

    Sadece sahibi bir projeyi düzenleyebilir.

    Sahip olmayanlar için/project/42/edit'e erişimi engellemek için bir Voter uyguladım.

    Şimdi, proje detay sayfasından "proje düzenle" bağlantısını da gizlemek istiyorum. Bunu yapmanın yolu ne olurdu? İdeal olarak, Twig içinde, ben bir Twig uzantısı olarak bu işlevi uygulayabilir

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

    böyle bir şey yapmak istiyorum, ama belki benzer bir işlevi zaten var.

  • cevap

    10

    fonksiyon is_granted() aslında has a second parameter ihtiyacım olanı bana sadece yapmaya izin verdiğini:

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

    budur:

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

    ben denetleyici eylem bir çek ile kombinasyon halinde kullanabilirsiniz Aslında nifr'un Sonata User - Security on custom field cevabında kullandığı yaklaşıma çok benzer. Seçmene otomatik olarak çağrılmanın bir yolunu bulmayı ve isGranted() 'a yapılan çağrıdan kaçınmayı umuyordum.

    Kodun tamamını incelemek isterseniz, published in github numaralı eğitim projemde.

    +2

    Lütfen herhangi bir kişi hack yapamazsınız. Denetleyicinizin de uygun yönlendirmelere sahip olduğundan emin olun. – Lighthart

    +0

    Güzel iş. Dikkat edilecek tek şey, eğer $ this-> show ($ project); 'sadece proje sayfasıyla aynı görüşü geri döndürüyor (/ project/42). Bu rotaya 302 yönlendirme kullanmak en iyi ihtimalle olacaktır. – Paulpro

    +0

    Ah, üzgünüm, $ this-> show ($ project) aslında $ this-> yönlendirme ($ this-> generateUrl ('project_show', array ('id' => $ project- $) döndüren küçük bir yardımcıdır > getId()))); – Olav