Symfony Ve Yaml İle Yetki Seviyeli İçerik Menüleri Oluşturmak
Yaml, web sitesinde kendini;
Tüm programlama dilleri için, insan dostu veri sıralama standardı
olarak tanımlıyor. Web uygulama geliştme frameworklerinden pek çoğu uygulama ayarlarının yapılandırılması konunusunda bu standarttan yardım alıyor. Elbette bizim ilgilendiğimiz ve bugün bahsedeceğimiz framework Symfony.
Geliştirdiğiniz uygulama içerisinde, uygulamanız içerisindeki bölümler arasında kullanıcının geçiş yapması için bazı linkler kullanırız. Genelde hazırladığımız uygulama çoklu kullanıma açık ise, bu linklerin kullanıcıların yetkilerine göre ekranda görüntülenmesi, yetkisi olmayan kullanıcıya ilgili menünün gösterilmemesi esastır. Dinamik olarak üretilen menüler içerisinde bunu sağlamak için veritabanından çekeceğimiz yetki bilgilerini ile bunu sağlamak mümkündür. Ancak veritabanına ihtiyaç duyulmayan belli sayıda menü içeren bir uygulama için genel olarak, menülere ait oldukları yetki alanları için bir tanımlama yapar bu tanımlama içerisinde karar-döngü yapıları içerisinde menülerin gösterilmesi veya gösterilmemesi konusunda uygulamamızın çalışmasını sağlarız.
Symfony ve Yaml formatının bu konudaki yeri ise, Yaml dosyası içerisinde hazırladığımız, basit, anlaşılır bir tanımlama dosyası ile bu tarz yetki korumalı sabit (static) bir menünün oluşturmaya çalışacağız.
Symfony uygulama ayarları vb. pek çok şey için Yaml formatını kullanıyor, ve 1.1 sürümü ile kendi özel Yaml okuyucusuna sahip. Symfony içerisindemi Yaml motoru, tanımladığımız elemanları birer PHP nesnesine çeviriyor, ve kodumuz içerisinde direkt olarak kullanmamıza olanak sağlıyor.
Bu örnekte hazırlayacağımız uygulamayı Symfony View bölümüne ait Component Slots bileşenleri ile hazırlayacağız. Component Slots‘lar bir nevi partial denilen kod parçacıklarının özelliklerini alırken diğer yandan, kendi özelliştirme imkanlarına sahip olduğunudan, diğer view elemanları arasında özel bir yer ediniyor. (Component Slots‘lar ile ilgili bilgiye Symfony dökümanyasyonunu Inside the view layer bölümünden ulaşabilirsiniz.)
Bir component slots yaratmak için yapacağımız sadece varolan modülümüz içerisindeki action klasörüne yeni bir PHP dosyası oluşturmak ve components.class.php adıyla kaydetmek. Ardından dosyamız içerisinde yeni bir PHP sınıfı oluşurarak uygulama içerisinde kullanacağımız ad ile adlandırıyoruz. Bizim uygulamamızda kullanacağımız ad “Elements”, bu nedenle sınıfımızı elementsComponents isimiyle oluşturuyor ve Symfony bileşenlerinin diğer özelliklerini miras almaları amacıyle sfComponents sınıfı ile (extends) genişletiyoruz.
<?php
class elementsComponents extends sfComponents
{
}
Daha sonra menü listemizi oluşturacak olan metodumuzu MenuList adıyla yapılandırıyoruz. Component Slots Symfony controller sınıfları gibi hareket ettiğinden isimlendirme de aynen controller sınıflarında olduğu gibi metod başına execute değimini yerleştirerek oluyor.
<?php
class elementsComponents extends sfComponents
{
public function executeMenuList ()
{
}
}
Daha sonra uygulamamız içerisinde kullanacağımız menü yapısını oluşturan Yaml dosyasının değişken olarak uygulama içerisine yüklenmesini sağlayan bölüme geliyoruz. Daha öncede bahsettiğimiz gibi Symfony 1.1 sürümü ile kendi Yaml parçalayıcısına sahip. Oluşturduğumuz Yaml dosyasını uygulama içerisinde yüklemek için kullanacağımız kod şu şekilde olacak.
$this->menu_list = sfYaml::load(dirname(__FILE__).'/../config/menu.yml');
Değişkeni $this anahtar değimi altında oluşturmamızın nedeni, menü içeriğimizi göstereceğimiz view dosyamız içerisinde $this->menu_list değişkeni altında depoladığımız verilerin kullanılmasına izin vermek. Bu sayede Symfony $this anahtar sözcüğü altındaki parametreleri view dosyamıza aktaracak ve view dosyası içerisinde bu parametreleri yerel değişkenler gibi kullanmamız mümkün olacak, bu örnekte ki $this->menu_list değişkenine, view dosyası içerisinden $menu_list şeklinde ulaşmamız mümkün olacak.
Yaml dosyamızı modülümüzün bulunduğu klasör içerisindeki config isimli klasöre kaydettik. Bu nedenle dosyamıza ulaşmak için component dosyamızın bulunduğu klasörün bir üst klasörü içerisindeki config klasöründeki menu.yml dosyasının yolunu izledik. Bunun PHP içindeki karşılığıda dirname(__FILE__).’/../config/menu.yml’) şeklinde oluyor.
Lafı uzatmadan menü içeriğimizin yapılandırılacağı menu.yml dosyamızı oluşturalım. Dosya içerisindeki elemanlarımız menu isimli bir anahtarın altında yapılandırılacaklardır.
menu:
- {title: Blog, module: post, action: list, routing: post_list, credentials: [admin, editor, writer]}
- {title: Sayfalar, module: pages, action: list, routing: pages, credentials: [admin, editor, writer]}
- {title: Yorumlar, module: comment, action: index, routing: comment_list, credentials: [admin, editor, writer]}
- {title: Kullanıcılar, module: users, action: add, routing: user_add, credentials: [admin]}
- {title: Etiketler, module: tag, action: tag_list, routing: tag_for_post, credentials: [admin, editor, writer]}
- {title: Dosyalar, module: file, action: file_list, routing: files, credentials: [admin, editor]}
- {title: Bağlantılar, module: connections, action: connection_list, routing: connections, credentials: [admin]}
menu anahtarı altındaki yapılandırmayı Symfony Yaml moturu birer dizi olarak algılayacak ve bu sayede oluşturduğumuz iç-içe diziler sayesinde, istediğimiz yetki seviyeli korumayı oluşturmuş olacağız. Şimdi kısaca oluşturduğumuz satırlardaki elemanları açıklayalım.
title: Menü elemanımız içerisinde görüntüleceğimiz metin içeriği oluşturur
module: menümüzün seçili olarak görüntüleneceği modülümüz seçmemize olanak verir
action: yine module niteliği gibi menümüzün seçili olarak işaretlemede kullanacağımız metodu seçmemizi sağlar
routing: routing.yml dosyası içinde tanımladığımız link hedeflerini otomatik olarak oluşturan tanımlamadır
credentials: Menü elemanını görüntüleyebilecek yetkileri oluşturduğumuz elemandır. “[]” şeklinde köşeli parantezler içerisinde olduğu için, bu elemanları bir PHP dizisi olarak kullanmamız mümkün olacaktır.
Tüm bunlardan sonra menü listeminizin görüntüleneceği _menuList.php isimli view dosyamızı oluşturalım. Bu dosyanın ismi Component içerisinde tanımladığımız MenuList isimli fonksiyondan gelmektedir. Symfony Component Slots elemanları için oluşturulan metod adına ait view dosyasını bulmak için böyle bir isimlendirme kuralı koymuştur.
<ul>
<?php foreach( $menu_list['menu'] as $key => $value ): ?>
<?php if ($sf_user->hasCredential($value['credentials'], false)): ?>
<li <?=(($value['module'] == $sf_request->getParameter('module')) AND ($value['action'] == $sf_request->getParameter('action'))) ? 'id="current"' : ""?>>
<?=link_to($value['title'], '@'.$value['routing'])?>
</li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
Görüldüğü gibi Component içerisindeki metodumuzda oluşturduğumuz $this->menu_list isimli değişkeni _menuList.php isimli view dosyasında $menu_list isimli değişken olarak kullanabiliyoruz. Yaml dosyamız içerisinde menu: anahtarı altında oluşturduğumuz menü elemanları bir PHP dizisi oluşturduğu için bu dizimize $menu_list[‘menu’] şeklinde ulaşıyoruz. Kodumuzun ilk satırı $menu_list[‘menu’] dizisi üzerinde bir foreach döngüsü oluşturuyor ve sıra ile dizi içerisindeki elemanlarımız $key=>$value ikilisi olarak kullanılabilir hale getiriyor.
$value[‘module] ve $value[‘action’] parametrelerini o anda görüntülenmekte olan sayfanın module ve action parametreleri ile karşılaştırarak sıradaki menü linkinin varolan sayfaya ait olup olmadığını kontrol ediyoruz. Bu sayede menüyü seçili olarak işaretleyip, kullanıcıya hangi sayfada bulunduğunu göstermemiz mümkün oluyor.
Sonraki satırda Symfony helper fonksiyonlarından link_to() ile bir link oluşturuyoruz. ilk parametre olarak görüntülenecek link metinini ($value[‘title’]) gönderiyoruz. İkinci parametre olarak da routing.yml içerisinde kuralını oluşturduğumuz anahtarı, önüne “@” işareti gelecek şekilde gönderiyoruz (“@comment_list” gibi). Bu sayede link_to() fonksiyoru routing.yml dosyası içerisinde tanımlanmış bir routing kuralı gönderdiğimizi anlıyor ve bu sayede o kural içerisindeki bilgilere göre bir hedef link oluşturuyor.
comment_list:
url: /comments
param: {module: comment, action: index}
Bu sayede menü listemizi oluşturacak Component Slots‘u oluşturmuş olduk. Kısaca bu oluşturduğumuz elemanı uygulamamız içerisinde nasıl kullanacağımıza değinelim. Componenti kullanacağımız uygulama içerisindeki view.yml dosyasına components isimli yeni bir anahtar ekliyoruz. (örnek olarak: SF_ROOT/apps/frontend/config/view.yml burada uygulamamızın ismi frontend).
default:
.... diğer varsayılan ayarlar
components:
menu_list: [elements, menuList]
Yaptığımız bu tanımlama ile menu_list isimli Component Slots‘u uygulamamıza tanıtmış oluyoruz. Daha sonra uygulamamız içerisinde
<?php include_component_slot('menu_list') ?>
şeklinde bu Component Slots‘u kullandığımızda, Symfony yaptığımız tanımlamayı hatırlıyor ve bizim için elements isimli sınıf içerisindeki MenuList metodunu çalıştırıyor ve menümüz oluşmuş oluyor.






Yorumlar