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ı
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:
- Modül etkin mi? Etkin olmayan modülün öğeleri görünmez.
- Yetki var mı?
capabilityboşsa yalnızca giriş yapmış olmak yeter.a|byazarsanız iki yetkiden birine sahip olmak yeterlidir. Yetkisi olmayan kullanıcı öğeyi görmez; adresi elle yazsa bile denetleyicideki#[IsGranted]onu durdurur. - Ü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ü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.