İçeriğe geç

Menü ve yetkiler

Menü öğesi eklemek

Menüde görünecek her yönetim ekranı, bir #[Route] ile birlikte #[CpAdminMenu] taşır:

#[Route('/admin/ornek', name: 'admin_ornek_index', methods: ['GET'])]
#[CpAdminMenu(label: 'Örnekler', icon: 'heroicons:squares-2x2', panel: 'studio', priority: 40, capability: 'ornek.view', group: 'studio.group.content')]
public function index(): Response { /* … */ }
Parametre Anlamı
panel studio (içerik) veya aacp (sistem)
priority küçük sayı önce
capability gerekli yetki; a|b = biri yeterli
parent üst öğenin rota adı (iki seviyeli alt menü)
group kenar çubuğu başlığı

Menü iki seviyelidir: üst öğe ve onun çocukları. Çocuğu olmayan klasör (hub) görünmez.

AACP'de Araçlar kuralı

Kural

Bir modül AACP'ye üst seviye menü öğesi ekleyemez. panel: 'aacp' ile kaydedilen ve üst öğesi olmayan (ya da başka bir modül öğesine bağlanan) her öğe derleme sırasında otomatik olarak Araçlar klasörüne taşınır.

Bir modül açıkça çekirdeğin bir klasörünü (ör. aacp_hub_system) üst öğe olarak belirtirse o yerleşim korunur. Kural AdminMenuRegistrationPass içinde uygulanır.

Menü nasıl kurulur

Menü, derleme sırasında denetleyicilerdeki #[CpAdminMenu] özniteliklerinden toplanır; her istekte yeniden taranmaz. Çizim anında (AdminMenuRuntime) üç süzgeç uygulanır:

  1. Modül etkin mi? Etkin olmayan modülün öğeleri görünmez.
  2. Yetki var mı? capability boşsa yalnızca giriş yapmış olmak yeter. a|b yazarsanız iki yetkiden birine sahip olmak yeterlidir. Yetkisi olmayan kullanıcı öğeyi görmez; adresi elle yazsa bile denetleyicideki #[IsGranted] onu durdurur.
  3. Üst öğe görünür mü? Alt öğe ancak üst öğesi görünürse görünür; üstü süzülen "yetim" öğe atlanır.
Menü bir güvenlik katmanı değildir

Menüden gizlemek erişimi kapatmaz. Her yönetim eylemine mutlaka #[IsGranted(...)] koyun; menü yalnızca yol göstericidir.

Alt menü örneği

Üst öğe ve onun çocukları aynı modülden olabilir. Çocuk, üst öğenin rota adını parent olarak verir:

#[Route('/admin/ornek', name: 'admin_ornek_index', methods: ['GET'])]
#[CpAdminMenu(label: 'Örnekler', icon: 'heroicons:squares-2x2', priority: 40, capability: 'ornek.view')]
public function index(): Response { /* … */ }

#[Route('/admin/ornek/etiketler', name: 'admin_ornek_tags', methods: ['GET'])]
#[CpAdminMenu(label: 'Etiketler', icon: 'heroicons:tag', priority: 41, capability: 'ornek.manage', parent: 'admin_ornek_index')]
public function tags(): Response { /* … */ }

Etiketler yalnızca hem Örnekler hem de ornek.manage yetkisi olan kullanıcıya görünür.

Simgeler

icon değeri symfony/ux-icons adıdır; çekirdekte heroicons: takımı kullanılır (heroicons:home, heroicons:cog-6-tooth…). Varsayılan heroicons:squares-2x2'dir. Simge adı yanlışsa menü bozulmaz ama simge boş görünür; yeni bir simgeyi eklemeden önce panelde bir kez açıp bakın.

Sıra ve gruplar

priority küçük olan önce gelir (varsayılan 100). group aynı kenar çubuğu başlığı altındaki öğeleri birlikte toplar; çekirdeğin kullandığı bir başlığı (studio.group.content gibi) verirseniz öğeniz o bölümde görünür. Aynı modülün birden çok ekranı varsa ardışık öncelik verin (40, 41, 42) ki başka modüllerin öğeleri araya girmesin.

Yetkiler

Resources/config/capabilities.yaml:

capabilities:
    - ornek.view
    - ornek.edit
    - ornek.manage

Denetleyicide #[IsGranted('ornek.edit')], şablonda is_granted('ornek.edit') kullanın. Yetkiler rollere AACP → Kullanıcılar'dan atanır.

Sonraki: Formlar ve Field API.

Son güncelleme: 13.10.2026